Asp.net-Mvc-3
如何使用 Ninject 注入一些通用的 asp.net http 處理程序?
我是使用 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 執行時實例化的。