2012-01-25 52 views
3

我對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,但我沒有看到哪些內容符合我想要做的。

如果有人有任何提示,可以幫助我解決我的小混亂,我將不勝感激!

回答

2

應對首先是不使用NinjectWebsiteApplication_BeginRequest事件,而是寫了一個自定義的全球行動過濾器的方式:

public class LogActionFilterAttribute : ActionFilterAttribute 
{ 
    private readonly ILogger _logger; 
    public LogActionFilterAttribute(ILogger logger) 
    { 
     _logger = logger; 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     _logger.Debug("**********REQUEST BEGIN****************"); 
     _logger.Debug("**** URL = " + filterContext.HttpContext.Request.Url.AbsolutePath); 
    } 
} 

,然後在App_Start/NinjectMVC3.cs

/// <summary> 
/// Load your modules or register your services here! 
/// </summary> 
/// <param name="kernel">The kernel.</param> 
private static void RegisterServices(IKernel kernel) 
{ 
    kernel.Bind<ILogger>().To<Logger>(); 
    kernel.BindFilter<LogActionFilterAttribute>(FilterScope.Global, 1); 
} 

不要忘記添加using Ninject.Web.Mvc.FilterBindingSyntax;以便將BindFilter<>擴展方法納入範圍。

而且因爲你有機會獲得RegisterServices方法,它發生在應用程序啓動內核裏面,你可以線了一切,包括你的引導程序,...

至於你Global.asax而言不再使用任何注入特定的東西。你不應該從NinjectApplication派生。

WebActivator基礎結構允許您擁有單獨的初始化方法。

+0

感謝您的詳細解釋!我明白理解日誌操作過濾器如何適用於開始請求,但結束請求又如何?例如,我有以下(也處理我的IUnitOfWork): void NinjectWebsiteApplication_EndRequest(object sender,System.EventArgs e){ILOGger logger = Kernel。獲取(); IUnitOfWork uow = Kernel.Get (); uow.Displose(); logger.Debug(「************ REQUEST END ************」); } – hiro77

+0

@JoelHulen,你只需在自定義操作過濾器中覆蓋OnActionExecuted或OnResultExecuted方法,就像我展示OnActionExecuting方法一樣,這取決於你想要在哪裏處理你的工作單元:該操作已完成執行或視圖已完成呈現。另外,如果你要處置你的UoF,你可能不應該調用LogActionFilterAttribute屬性。你可以創建另一個進行處理。 –

+0

它完美地工作。謝謝!在你看來,就處置UoW而言,是否存在一個優先處理OnAction執行OnResultExecuted?另外,您是否知道控制器操作「退出」全局過濾器屬性的方法? – hiro77

相關問題