我一直在我的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任何人都有任何想法,爲什麼這不適合我或任何示例代碼的地方,它明確的工作?
感謝
現貨感謝,但後來我想答案不會從創作者錯! Ninject非常好,我喜歡它。任何想法,當你希望Ninject2被釋放? – 2009-02-11 14:59:56