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

Cri*_*lia 7 ninject generic-handler asp.net-mvc-3

我是一个使用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();
Run Code Online (Sandbox Code Playgroud)

当我尝试通过使用属性注入(使用[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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我也试过这样做:

    readonly INLUserRepository userRep;

    public SubscriberHandler()
    {

        using (IKernel kernel = new StandardKernel(new App_Start.NJRepositoryModule()))
        {
            userRep = kernel.Get<INLUserRepository>();
        }
    }
Run Code Online (Sandbox Code Playgroud)

但我得到一个例外:"加载Ninject组件ICache时出错.在内核的组件容器中没有注册这样的组件.建议:1)如果你为KernelBase创建了一个自定义子类,请确保你已经正确实现了AddComponents( 2)确保你没有通过调用RemoveAll()从容器中删除组件.3)确保你没有意外地创建了多个内核."

这告诉我,我不应该在我的应用程序中实例化多个内核,对吧?我究竟做错了什么?谢谢

Dar*_*rov 6

您可以使用依赖项解析器:

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我期望从这个答案中得到负面的反馈,因为服务定位器模式被许多人视为反模式。

但是我不确定NInject是否允许您对HTTP处理程序使用构造函数注入,因为它们是由ASP.NET运行时实例化的。

  • 不会有-1人试图提供帮助(即使他们正在向人们展示如何使用SL!),但这答案是http://stackoverflow.com/a/3629684/11635的dup,问题是这个的dup太 (2认同)
  • @Darin Dimitrov:公平的观点。(但是它们都是SL,因此从我的角度来看仍然相同) (2认同)

Rem*_*oor 5

IHttpHandlers 的组成根是IHttpHandlerFactory.您可以创建IHttpHandlerFactory使用Ninject 创建自定义实例的自定义 IHttpHandler.这样你就可以使用构造函数注入.