我是 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] 属性)从通用处理程序获取某些服务时,我总是得到 null。这就是我的处理程序的样子:
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 运行时实例化的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)