使用Ninject在MVC2中进行IHttphandler属性注入

时间:2010-12-18 14:01:42

标签: asp.net-mvc asp.net-mvc-2 dependency-injection ninject

我正在寻找一种在MVC中为IHttpHandlers进行属性注入的方法。

对于webforms ninject,你可以继承HttpHandlerBase。

这不再有效,因为应用程序现在继承自Ninject.Web.Mvc.NinjectApplication NOT Ninject.Web.NinjectHttpApplication。

此应用程序注册控制器的类型而不是PageBase,MasterPageBase或HttpHandlerBase。

垃圾。

他们可以使用MvcHandler类吗?

以下帖子是我最接近答案的帖子。

HttpHandler Property Injection using Ninject returning null

1 个答案:

答案 0 :(得分:2)

如果从源代码构建Ninject.Web.Mvc,请在Ninject.Web.Mvc命名空间中包含Ninject.Web中的HttpHandlerBase类的副本。

否则你自己的HttpHandlerBase需要自己调用Kernel.Inject。内核引用可以通过应用程序范围或通过反射获得。

HttpApplication.CreateKernel()中将Application范围内的内核实例存储为“NinjectKernel”。然后将以下内容添加为IHttpHandler基类。

public abstract class HttpHandlerBase : IHttpHandler
{
    public abstract void ProcessRequest( HttpContext context );

    void IHttpHandler.ProcessRequest( HttpContext context )
    {
        var kernel = (IKernel) context.Application["NinjectKernel"];
        kernel.Inject( this );

        this.ProcessRequest( context );
    }
}

反射方法不需要HttpApplication中的任何代码。

public abstract class HttpHandlerBase : IHttpHandler
{
    public abstract void ProcessRequest( HttpContext context );

    void IHttpHandler.ProcessRequest( HttpContext context )
    {
        Assembly ass = Assembly.Load("Ninject.Web.Mvc");
        Type type = ass.GetType("Ninject.Web.Mvc.KernelContainer");
        MethodInfo init = type.GetMethod("Inject", BindingFlags.Static | BindingFlags.Public, null, new Type[] { typeof(object) }, null );
        init.Invoke( null, new object[] {} );

        this.ProcessRequest( context );
    }
}