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.
+1 Ninject semplifica la sessione per richiesta come risposta utilizzando InRequestScope() http://bit.ly/HJADY3 – DalSoft
Dove si chiama SaveChanges()? Ho provato a farlo in Application_EndRequest senza fortuna. – Andrew
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. –