Asp.net-Mvc-3

如何使用 Ninject 注入一些通用的 asp.net http 處理程序?

  • October 31, 2018

我是使用 Ninject 的新手,我不知道如何注入我的通用 http 處理程序。我有一個 MVC3 項目,我將我的服務注入到控制器中,完全沒有問題。這是我在 Ninject App_start 類中註冊服務的內容:

       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();

當我嘗試通過使用屬性注入從我的通用處理程序中獲取一些服務時(使用

$$ inject $$屬性)我總是得到空值。這就是我的處理程序的樣子:

   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) 確保您沒有通過呼叫 RemoveAll() 從容器中刪除組件。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 執行時實例化的。

引用自:https://stackoverflow.com/questions/10446737