2012-03-01 14 views
11

Voglio utilizzare RavenDB con ninject nel mio progetto asp.net mvc3, Qualche idea su come devo configurarlo?RavenDB con Ninject in ASP.NET MVC3

 kernel.Bind<Raven.Client.IDocumentSession>() 
       .To<Raven.Client.Document.DocumentStore>() 
       .InSingletonScope() 
       .WithConstructorArgument("ConnectionString", ConfigurationManager.ConnectionStrings["RavenDB"].ConnectionString); 

risposta

25

Ecco come lo faccio mia:

Se si installa Ninject con Nuget, si otterrà un file/App_start/NinjectMVC3.cs. Lì dentro:

private static void RegisterServices(IKernel kernel) 
    {    
     kernel.Load<RavenModule>(); 
    }  

Ecco la classe RavenModule:

public class RavenModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IDocumentStore>() 
      .ToMethod(InitDocStore) 
      .InSingletonScope(); 

     Bind<IDocumentSession>() 
      .ToMethod(c => c.Kernel.Get<IDocumentStore>().OpenSession()) 
      .InRequestScope(); 
    } 

    private IDocumentStore InitDocStore(IContext context) 
    { 
     DocumentStore ds = new DocumentStore { ConnectionStringName = "Raven" }; 
     RavenProfiler.InitializeFor(ds); 
     // also good to setup the glimpse plugin here    
     ds.Initialize(); 
     RavenIndexes.CreateIndexes(ds); 
     return ds; 
    } 
} 

E per completezza ecco il mio indice di classe di creazione:

public static class RavenIndexes 
{ 
    public static void CreateIndexes(IDocumentStore docStore) 
    { 
     IndexCreation.CreateIndexes(typeof(RavenIndexes).Assembly, docStore); 
    } 

    public class SearchIndex : AbstractMultiMapIndexCreationTask<SearchIndex.Result> 
    { 
     // implementation omitted 
    } 
} 

Spero che questo aiuta!

+0

+1 Ninject semplifica la sessione per richiesta come risposta utilizzando InRequestScope() http://bit.ly/HJADY3 – DalSoft

+0

Dove si chiama SaveChanges()? Ho provato a farlo in Application_EndRequest senza fortuna. – Andrew

+0

Io chiamo SaveChanges() esplicitamente quando ha senso farlo, non automaticamente alla fine di ogni richiesta. Non sono sicuro del motivo per cui devi farlo o perché hai problemi. Sospetto che abbia qualcosa a che fare con l'ordine delle operazioni di Ninject con le dipendenze con scope richieste, sebbene non ci sia alcun modo di capire senza alcune informazioni diagnostiche. –

7

mi consiglia di utilizzare una consuetudine Ninject provider per configurare il RavenDB DocumentStore. Per prima cosa inseriscilo nel tuo blocco di codice che registra i tuoi servizi Ninject.

kernel.Bind<IDocumentStore>().ToProvider<RavenDocumentStoreProvider>().InSingletonScope(); 

Successivamente, aggiungere questa classe che implementa il provider Ninject.

public class RavenDocumentStoreProvider : Provider<IDocumentStore> 
{ 
    var store = new DocumentStore { ConnectionName = "RavenDB" }; 
    store.Conventions.IdentityPartsSeparator = "-"; // Nice for using IDs in routing 
    store.Initialize(); 
    return store; 
} 

L'IDocumentStore deve essere un Singleton, ma non fanno l'IDocumentSession un Singleton. Ti consiglio di creare semplicemente un nuovo IDocumentSession usando OpenSession() sull'istanza di IDocumentStore che Ninject ti fornisce ogni volta che devi interagire con RavenDB. Gli oggetti IDocumentSession sono molto leggeri, seguono lo schema dell'unità di lavoro, non sono thread-safe e sono pensati per essere utilizzati e disposti rapidamente dove necessario.

Come altri hanno fatto, si potrebbe anche considerare l'implementazione di un controller MVC di base che sovrascrive i metodi OnActionExecuting e OnActionExecuted per aprire una sessione e salvare le modifiche, rispettivamente.

Problemi correlati