2012-11-07 13 views
9

Qualcuno può guidarmi su come potrei registrare RavenDB usando Autofac?Registrati RavenDb usando Autofac?

builder.Register<DocumentStore>( .. che dopo?

+1

Ecco una domanda correlata: http://stackoverflow.com/questions/10940988/how-to-configure-simple-injector-ioc-to-use-ravendb. Parla di Simple Injector, ma sarebbe praticamente lo stesso per Autofac. – Steven

risposta

15

Qui è un programma di console di esempio che illustra non solo come collegare il negozio documento, ma anche come impostarlo in modo si può solo iniettare la sessione di documento:

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; } 
    } 
} 

noti che DocumentStore è single istanza, ma DocumentSession è un'istanza per ambito di validità. Per questo esempio, sto creando manualmente gli ambiti di vita e lo facciamo in parallelo, simulando il modo in cui 5 diversi utenti potrebbero effettuare ordini allo stesso tempo. Ognuno prenderà la propria sessione.

L'inserimento di SaveChanges nell'evento OnRelease è facoltativo, ma consente di evitare di doverlo inserire in tutti i servizi.

Nel mondo reale, questa potrebbe essere un'applicazione Web o un'applicazione di bus di servizio, nel qual caso la sessione deve essere portata rispettivamente alla singola richiesta Web o alla durata del messaggio.

Se si utilizza ASP.Net WebApi, è necessario recuperare il pacchetto Autofac.WebApi da NuGet e utilizzare il metodo .InstancePerApiRequest(), che crea automaticamente l'ambito di validità appropriato.

+0

grazie! funziona come un fascino! – trailmax