2012-03-01 8 views
11

Chcę użyć RavenDB z ninject w moim projekcie asp.net mvc3, Każdy pomysł, jak mam to skonfigurować?RavenDB z Ninject w ASP.NET MVC3

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

Odpowiedz

25

Oto jak zrobić Mine:

Jeśli zainstalujesz Ninject z Nuget, dostaniesz plik/App_start/NinjectMVC3.cs. Tam:

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

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

A dla kompletności oto moja klasa tworzenie index:

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

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

Mam nadzieję, że to pomoże!

+0

+1 Program Ninject ułatwia wykonywanie sesji na żądanie, gdy odpowiedź została odebrana za pomocą metody InRequestScope() http://bit.ly/HJADY3 – DalSoft

+0

. Jak nazywasz SaveChanges()? Próbowałem zrobić to w Application_EndRequest bez powodzenia. – Andrew

+0

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. –

7

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.

Powiązane problemy