2012-05-04 22 views
6

我是一個使用Ninject的新手,我無法弄清楚如何注入到我的通用http處理程序中。我有一個MVC3項目,我將我的服務注入到控制器中,完全沒有問題。 這是我在我的Ninject App_start類得到了註冊服務:如何使用Ninject注入一些通用的asp.net http處理程序?

 private static void RegisterServices(IKernel kernel) 
    { 
     kernel.Bind<NLSubscriber.Core.Service.Repository.INLUserRepository>().To<NLSubscriber.Core.Service.Repository.EFDAL.EFNLUserRepository>().InRequestScope(); 
     kernel.Bind<Neticon.Mvc.Helpers.IConfigHelper>().To<Neticon.Mvc.Helpers.AzureEnabledConfigHelper>().InSingletonScope(); 
     kernel.Bind<Neticon.Security.Service.IAuthenticationService>().ToMethod(m => Neticon.Security.Service.SecurityServiceFactory.CreateAuthenticationService()).InRequestScope(); 
     kernel.Bind<Neticon.Security.Service.IMembershipService>().ToMethod(m => Neticon.Security.Service.SecurityServiceFactory.CreateMembershipService()).InRequestScope(); 
     kernel.Bind<Neticon.Security.Service.IRoleManagerService>().ToMethod(m => Neticon.Security.Service.SecurityServiceFactory.CreateRoleManagerService()).InRequestScope(); 

當我嘗試通過使用屬性注入(與[注]屬性),我總是得到空從我的通用處理器得到一些服務。這是我的處理程序看起來像:

public class SubscriberHandler : IHttpHandler 
{ 
    [Inject] 
    public INLUserRepository userRep { get; set;} 

    public void ProcessRequest(HttpContext context) 
    { 
     var users = userRep.GetUsers(); //userRep is always null here 
    } 


    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 

我自己也嘗試做這樣的:

readonly INLUserRepository userRep; 

    public SubscriberHandler() 
    { 

     using (IKernel kernel = new StandardKernel(new App_Start.NJRepositoryModule())) 
     { 
      userRep = kernel.Get<INLUserRepository>(); 
     } 
    } 

,但我發現了異常:「錯誤加載Ninject組件icache中沒有這樣的組件有已經登記在內核組件容器 建議: 1)如果你已經創建了KernelBase自定義子類,請確保您有正確 實施AddComponents()方法 2)確保你沒有從刪除的組件。容器通過呼叫移除所有()。 3)確保你不小心創建多個內核。」

這是暗示我,我不應該在我的應用程序創建一個以上的內核,對吧? 我在做什麼錯? 感謝

+1

可能的重複http://stackoverflow.com/questions/3629472/httphandler-property-injection-using-ninject-returning-null – Andreas

回答

3

你可以使用依賴解析器:

public class SubscriberHandler : IHttpHandler 
{ 
    public INLUserRepository userRep { get; private set; } 

    public SubscriberHandler() 
    { 
     userRep = DependencyResolver.Current.GetService<INLUserRepository>(); 
    } 

    public void ProcessRequest(HttpContext context) 
    { 
     var users = userRep.GetUsers(); //userRep is always null here 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 

我期待,因爲服務定位器模式被許多人認爲是一個反模式,從這個答案得到負反饋

但我不確定NInject是否允許您爲HTTP處理程序使用構造函數注入,因爲它們是由ASP.NET運行時實例化的。

+0

謝謝達林。這對我來說現在是有效的。關於反模式,正如你所看到的,我已經通過了......我的意思是,使用inject屬性或任何其他直接引用Ninject也不是很好。一個評論,雖然,我讓userRep私人只讀,不需要公開... –

+2

Wont -1人試圖幫助(即使他們正在向人們展示如何使用SL!),但這個答案是一個http的重複://stackoverflow.com/a/3629684/11635和問題是這也是一個dup –

+0

@RubenBartelink,在你發佈的dup鏈接中他們使用'ServiceLocator.Current.GetInstance ();'而在我的例子中,我使用'DependencyResolver.Current.GetService ();'這是一個ASP.NET MVC 3特定的類。 –

5

IHttpHandler s的組成根是IHttpHandlerFactory。您可以創建一個自定義IHttpHandlerFactory,它使用Ninject創建IHttpHandler的實例。這樣你可以使用構造函數注入。

+0

你可以堅持到http://stackoverflow.com/questions/3629472/httphandler-property-injection-using-ninject-returning-null和VTC這個請。 –

+1

雷莫,你有沒有在任何地方演示這個例子? –

+0

嗨,有沒有任何示例代碼。我們如何獲得處理程序實例。 – veshu