2011-04-02 26 views
2

我有一個ASP.Net web表單的應用程序,其使用Ninject 2.2.0.0訪問Ninject Kernel.Get()從HttpHandler的與現有的定製基

我具有從Microsoft.Web.ImageHandler類繼承的HttpHandler的。

其中我需要訪問我創建的服務類的實例。

,因爲我無法從Ninject.Web.HttpHandlerBase繼承我想我會剛剛露出內核上在Global.asax類的屬性...

protected override IKernel CreateKernel() 
    { 
     IKernel kernel = new StandardKernel(new DefaultModule()); 

     var sms = kernel.Get<SiteMapService>(); 
     SiteMapSvc = sms; 
     Kernel = kernel; 
     return kernel; 

    } 

    public IKernel Kernel 
    { 
     get; set; 
    } 

,並使用kernel.Get方法來獲得服務..

var global = (Global) HttpContext.Current.ApplicationInstance; 

var service = global.Kernel.Get<PhotoService>(); 

這種失敗與以下...

[ArgumentNullException: Cannot be null 
Parameter name: root] 
    Ninject.ResolutionExtensions.GetResolutionIterator(IResolutionRoot root, Type service, Func`2 constraint, IEnumerable`1 parameters, Boolean isOptional, Boolean isUnique) in c:\Projects\Ninject\ninject\src\Ninject\Syntax\ResolutionExtensions.cs:258 
    Ninject.ResolutionExtensions.Get(IResolutionRoot root, Type service, IParameter[] parameters) in c:\Projects\Ninject\ninject\src\Ninject\Syntax\ResolutionExtensions.cs:151 
    Thumb.GenerateImage(NameValueCollection parameters) in \Thumb.ashx.cs:40 

UPDATE: 我設法通過修改Global.Kernel屬性來此解決這一問題,但我現在進入anti pattern territory ...

public IKernel Kernel 
    { 
     get { return this.CreateKernel(); } 
    } 

現在會讀,看看這是什麼意思..

回答

6

這是使用Service-Locator anti-pattern。它會起作用,但是你失去了IoC的靈活性,並且在任何難以測試的地方添加依賴項。

這個簡單的答案是,你可以添加「KernelContainer.Inject(this)」到你的HttpHandler。或者你可以創建一個自定義模塊(或修改現有的Ninject.Web)來執行處理程序之前的注入。

+0

它確實看起來像一個黑客,這是肯定的。感謝指向KernelContainer的指針。在這裏花一些時間。 – Baldy 2011-04-03 08:23:30

+0

我開始相信IoC容器是一種反模式... – garryp 2015-05-08 08:51:50

+0

編譯時間的損失檢查我的應用程序的能力缺失它需要運行的主要部分似乎是一個非常沉重的代價,以減少耦合。 – 2016-04-13 18:20:14