2012-11-07 15 views
9

Kann mir jemand sagen, wie ich RavenDB mit Autofac registrieren kann?RavenDb mit Autofac registrieren?

.. was danach?

+1

Hier ist eine verwandte Frage: http://stackoverflow.com/questions/10940988/how-to-configure-simple-injector-ioc-to-use-ravendb. Es spricht von Simple Injector, aber für Autofac wäre das genauso. – Steven

Antwort

15

Hier ist ein Beispiel Konsolenprogramm, das nicht nur zeigt, wie das Dokument speichern verkabeln, sondern auch, wie man es so einrichten, können Sie einfach Ihr Dokument Sitzung injizieren:

using System.Threading.Tasks; 
using Autofac; 
using Raven.Client; 
using Raven.Client.Document; 

namespace ConsoleApplication1 
{ 
    internal class Program 
    { 
    private static void Main() 
    { 
     var builder = new ContainerBuilder(); 

     // Register the document store as single instance, 
     // initializing it on first use. 
     builder.Register(x => 
     { 
      var store = new DocumentStore { Url = "http://localhost:8080" }; 
      store.Initialize(); 
      return store; 
     }) 
      .As<IDocumentStore>() 
      .SingleInstance(); 

     // Register the session, opening a new session per lifetime scope. 
     builder.Register(x => x.Resolve<IDocumentStore>().OpenSession()) 
      .As<IDocumentSession>() 
      .InstancePerLifetimeScope() 
      .OnRelease(x => 
      { 
       // When the scope is released, save changes 
       // before disposing the session. 
       x.SaveChanges(); 
       x.Dispose(); 
      }); 

     // Register other services as you see fit 
     builder.RegisterType<OrderService>().As<IOrderService>(); 

     var container = builder.Build(); 


     // Simulate some activity. 5 users are placing orders simultaneously. 
     Parallel.For(0, 5, i => 
     { 
      // Each user gets their own scope. In the real world this would be 
      // a new inbound call, such as a web request, and you would let an 
      // autofac plugin create the scope rather than creating it manually. 
      using (var scope = container.BeginLifetimeScope()) 
      { 
      // Let's do it. Again, in the real world you would just inject 
      // your service to something already wired up, like an MVC 
      // controller. Here, we will resolve the service manually. 
      var orderService = scope.Resolve<IOrderService>(); 
      orderService.PlaceOrder(); 
      } 
     }); 
    } 
    } 

    // Define the order service 
    public interface IOrderService 
    { 
    void PlaceOrder(); 
    } 

    public class OrderService : IOrderService 
    { 
    private readonly IDocumentSession _session; 

    // Note how the session is being constructor injected 
    public OrderService(IDocumentSession session) 
    { 
     _session = session; 
    } 

    public void PlaceOrder() 
    { 
     _session.Store(new Order { Description = "Stuff", Total = 100.00m }); 

     // we don't have to call .SaveChanges() here because we are doing it 
     // globally for the lifetime scope of the session. 
    } 
    } 

    // Just a sample of something to save into raven. 
    public class Order 
    { 
    public string Id { get; set; } 
    public string Description { get; set; } 
    public decimal Total { get; set; } 
    } 
} 

Beachten Sie, dass DocumentStor Single sind Instanz, aber DocumentSession ist Instanz pro Gültigkeitsbereich. Für dieses Beispiel erstelle ich manuell die Lebenszeitbereiche und tue es parallel, indem ich simuliere, wie fünf verschiedene Benutzer gleichzeitig Bestellungen aufgeben. Sie bekommen jeweils ihre eigene Sitzung.

Das Speichern von SaveChanges im OnRelease-Ereignis ist optional, es erspart Ihnen jedoch, es in jeden Dienst zu übernehmen.

In der realen Welt könnte dies eine Webanwendung oder eine Dienstbusanwendung sein. In diesem Fall sollte Ihre Sitzung entweder auf die einzelne Webanforderung oder die Lebensdauer der Nachricht beschränkt sein.

Wenn Sie ASP.Net WebApi verwenden, sollten Sie das Autofac.WebApi-Paket von NuGet abrufen und ihre .InstancePerApiRequest() -Methode verwenden, die automatisch den entsprechenden Lebensdauerbereich erstellt.

+0

danke! klappt wunderbar! – trailmax