2009-02-11 18 views
6

Używam programu Ninject jako mojego IOC w mojej aplikacji internetowej. Jest świetny i myślę, że działa naprawdę dobrze, jednak próbuję zarejestrować niektóre interfejsy/klasy jako OnePerRequestBehaviour, ale wydaje się, że nie używa tego zachowania. Kod działa poprawnie, ale w jednej z moich klas to leniwy ładuje informacje o stronie z bazy danych, a po wczytaniu nie musi trafiać do bazy danych.Ninject OnePerRequestBehaviour wydaje się nie działać poprawnie?

Mój problem polega na tym, że załadowana własność ładuje się w moim pierwszym żądaniu, gdy następnie zażądam następnej strony, to samo wystąpienie klasy jest używane. Powód, dla którego o tym wiem, jest taki, że klasa nie jest ponownie tworzona, a właściwość leniwej ładowności jest już ustawiona.

Kod ten jest w mojej klasie module:

public class NinjectModule : StandardModule 
{ 
    public override void Load() 
    { 
     Bind<IUnitOfWorkDataStore>().To<HttpContextDataStore>().Using<OnePerRequestBehavior>(); 


     Bind<CmsService>().ToSelf().Using<OnePerRequestBehavior>(); 
     Bind<CmsRepository>().ToSelf().Using<OnePerRequestBehavior>(); 
    } 
} 

następnie wewnątrz mojego Global.asax która dziedziczy z NinjectHttpApplication Mam następujący:

 protected override IKernel CreateKernel() 
     { 
      OnePerRequestModule module = new OnePerRequestModule(); 
      module.Init(this); 

      KernelOptions options = new KernelOptions(); 
      options.InjectNonPublicMembers = true; 

      IKernel kernel = new StandardKernel(options, new NinjectModule()); 

      return kernel; 
     } 

Pierwsze połączenie wykonane do CmsService jest w ramach global.asax jak również na żądanie authenticate_request:

protected void Application_AuthenticateRequest(object sender, EventArgs e) 
     { 
      if (HttpContext.Current.Request.Url.AbsoluteUri.Contains(".aspx") && 
       !HttpContext.Current.Request.Url.AbsoluteUri.Contains(".aspx/")) 
      { 
       CmsService facCMS = HttpKernelFactory.Get<CmsService>(); 
       ContentPage page = facCMS.GetCurrentPage(); 

       // DO Logic based on the page being brought back 
      } 
     } 

T on powyżej GetCurrentPage() kod:

public ContentPage GetCurrentPage() 
{ 
    if (_currentPage != null) 
     return _currentPage; 

    return GetCurrentPage(_isAdmin); 
} 

Więc jak widać zmienna _currentPage ładowany jest tylko wtedy, gdy nie została ustalona wcześniej, co powinno być raz na żądanie, jednak Ninject nie wydaje się być stworzenie CmsService na żądanie wydaje się tworzyć go przez abritrary ilość czasu.

Ktoś może wiedzieć, dlaczego to nie działa dla mnie lub przykład kodu, który z pewnością działa?

Dzięki

Odpowiedz

8

OnePerRequestModule jest HttpModule i musi być załadowany do rurociągu ASP.NET w celu podjęcia pracy. Jeśli dodać go do pliku web.config, to powinno działać:

IIS7:

<system.webServer> 
    <modules> 
    <add name="OnePerRequestModule" type="Ninject.Core.Behavior.OnePerRequestModule, Ninject.Core"/> 
    </modules> 
</system.webServer> 

IIS6:

<system.web> 
    <httpModules> 
    <add name="OnePerRequestModule" type="Ninject.Core.Behavior.OnePerRequestModule, Ninject.Core"/> 
    </httpModules> 
</system.web> 

OnePerRequest zachowanie znacznie się poprawiła w Ninject2 (co jest jeszcze do wydany).

+1

Zgadnij, dziękuję, ale myślę, że odpowiedź nie byłaby zła od twórcy! Ninject jest naprawdę dobry, uwielbiam to. Masz pomysł, kiedy masz nadzieję na wydanie gry Ninject2? –

Powiązane problemy