2009-02-11 112 views
6

我一直在我的web應用中使用Ninject作爲我的IOC。這很好,我認爲它工作得很好,但是我一直在嘗試將一些接口/類註冊爲OnePerRequestBehaviour,但它似乎並沒有實際使用這種行爲。代碼運行正常,但是在我的一個類中,它懶惰地從數據庫加載頁面信息,然後一旦它被加載,它不需要擊中數據庫。Ninject OnePerRequestBehaviour似乎不能正常工作?

我的問題是,延遲加載的屬性將加載在我的第一個請求,當我然後請求下一頁使用同一個類的實例。我知道這個的原因是因爲這個類沒有再次實例化,並且已經設置了延遲加載的屬性。

此代碼是我模塊類中:

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


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

然後我的Global.asax從NinjectHttpApplication繼承裏面我有以下幾點:

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

到CmsService作出的第一個電話是內global.asax以及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他上面GetCurrentPage()代碼:

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

    return GetCurrentPage(_isAdmin); 
} 

所以你可以看到,如果它沒有被前設置_currentPage變量只加載,這應該是每個請求一次,然而Ninject似乎並沒有被創造CmsService每個請求似乎創建一個無聊的時間。

Deos任何人都有任何想法,爲什麼這不適合我或任何示例代碼的地方,它明確的工作?

感謝

回答

8

的OnePerRequestModule是一個HttpModule,並需要被加載到你的ASP.NET管道才能工作。如果你把它添加到你的web.config,它應該工作:

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行爲大大Ninject2(改善這一點還沒有被髮布)。

+1

現貨感謝,但後來我想答案不會從創作者錯! Ninject非常好,我喜歡它。任何想法,當你希望Ninject2被釋放? – 2009-02-11 14:59:56

相關問題