Zalecam użycie niestandardowego dostawcy programu Ninject do skonfigurowania naszego sklepu RavenDB. Najpierw umieść to w swoim bloku kodu, który rejestruje twoje usługi Ninject.
kernel.Bind<IDocumentStore>().ToProvider<RavenDocumentStoreProvider>().InSingletonScope();
Następnie dodaj tę klasę, która implementuje dostawcę 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;
}
IDocumentStore musi być pojedyncza, ale nie sprawiają, że IDocumentSession pojedyncza. Zalecam, aby po prostu utworzyć nową IDocumentSession przy użyciu OpenSession() w instancji IDocumentStore Ninject daje ci, gdy potrzebujesz interakcji z RavenDB. Obiekty obiektów IDocumentSession są bardzo lekkie, zgodne z wzorcem jednostkowej pracy, nie są bezpieczne dla wątków i są przeznaczone do użycia i szybko rozmieszczone w razie potrzeby.
Podobnie jak inni, można również rozważyć wdrożenie podstawowego kontrolera MVC, który zastępuje metody OnActionExecuting i OnActionExecuted w celu otwarcia sesji i zapisania zmian.
+1 Program Ninject ułatwia wykonywanie sesji na żądanie, gdy odpowiedź została odebrana za pomocą metody InRequestScope() http://bit.ly/HJADY3 – DalSoft
. Jak nazywasz SaveChanges()? Próbowałem zrobić to w Application_EndRequest bez powodzenia. – Andrew
Wywołuję funkcję SaveChanges() jawnie, gdy ma to sens, a nie automatycznie na końcu każdego żądania. Nie wiem, dlaczego musisz to zrobić lub dlaczego masz problemy. Podejrzewam, że ma to coś wspólnego z kolejnością operacji Ninjecta z zależnościami zależnymi od żądań, chociaż nie ma żadnych informacji bez niektórych informacji diagnostycznych. –