我正在寻找一种在MVC中为IHttpHandlers进行属性注入的方法。
对于webforms ninject,你可以继承HttpHandlerBase。
这不再有效,因为应用程序现在继承自Ninject.Web.Mvc.NinjectApplication NOT Ninject.Web.NinjectHttpApplication。
此应用程序注册控制器的类型而不是PageBase,MasterPageBase或HttpHandlerBase。
垃圾。
他们可以使用MvcHandler类吗?
以下帖子是我最接近答案的帖子。
答案 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 );
}
}