我對Ninject以及DI一般都很陌生。我使用NHibernate作爲我的MVC應用程序的ORM,並對我的結果非常滿意。也就是說,直到我從Ninject 2.1升級到2.2。如何不使用Ninject的內核作爲資源定位器
現在,由於使用Ninject的內核作爲資源定位器,我在我的NinjectWebsiteApplication類中出現錯誤。
實施例:
void NinjectWebsiteApplication_BeginRequest(object sender, System.EventArgs e)
{
ILogger logger = Kernel.Get<ILogger>();
logger.Debug(「**********REQUEST BEGIN****************」);
logger.Debug(「**** URL = 」 + Request.Url.AbsolutePath);
}
實施例2:
protected override void OnApplicationStarted()
{
var bootstrapper = Kernel.Get<Bootstrapper>();
bootstrapper.RegisterAllAreas();
AreaRegistration.RegisterAllAreas();
......
(More stuff here, like AutoMapper mappings, etc.)
......
}
*的Bootstrapper
類是我創建了一個類,其中註冊我路線,全局過濾器等
在這兩種上述示例中,我收到有關Kernel.Get()
函數的警告,其中聲明以下內容:
「Ninject.Web.Mvc.NinjectHttpApplication.Kernel」已過時:「不要使用Ninject的服務定位器」
在此進行了一系列的搜索後,普遍的共識是,這是真的。
我正在努力解決這個問題,但是在做些什麼的時候會有點不知所措。
我加載了最新的Ninject.Web.Mvc NuGet包,它在App_Start文件夾下創建NinjectMVC3靜態類。我發現他們引用Microsoft.Web.Infrastructure.DynamicModuleHelper
,但我沒有看到哪些內容符合我想要做的。
如果有人有任何提示,可以幫助我解決我的小混亂,我將不勝感激!
感謝您的詳細解釋!我明白理解日誌操作過濾器如何適用於開始請求,但結束請求又如何?例如,我有以下(也處理我的IUnitOfWork): void NinjectWebsiteApplication_EndRequest(object sender,System.EventArgs e){ILOGger logger = Kernel。獲取(); IUnitOfWork uow = Kernel.Get (); uow.Displose(); logger.Debug(「************ REQUEST END ************」); } –
hiro77
@JoelHulen,你只需在自定義操作過濾器中覆蓋OnActionExecuted或OnResultExecuted方法,就像我展示OnActionExecuting方法一樣,這取決於你想要在哪裏處理你的工作單元:該操作已完成執行或視圖已完成呈現。另外,如果你要處置你的UoF,你可能不應該調用LogActionFilterAttribute屬性。你可以創建另一個進行處理。 –
它完美地工作。謝謝!在你看來,就處置UoW而言,是否存在一個優先處理OnAction執行OnResultExecuted?另外,您是否知道控制器操作「退出」全局過濾器屬性的方法? – hiro77