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

发布于 2024-10-08 09:57:15 字数 508 浏览 3 评论 0原文

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

对于 webforms ninject,您可以直接从 HttpHandlerBase 继承。

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

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

垃圾。

他们是否可以使用 MvcHandler 类来实现这一点?

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

使用 Ninject 返回 null 的 HttpHandler 属性注入

I'm looking for a way to do property injection in MVC for IHttpHandlers.

In the case of webforms ninject you could just inherit from HttpHandlerBase.

This no longer works as the application now inherits from Ninject.Web.Mvc.NinjectApplication NOT Ninject.Web.NinjectHttpApplication.

This application registers types for controllers not PageBase, MasterPageBase or HttpHandlerBase.

Rubbish.

Is their a way of doing it maybe with the MvcHandler class?

The post below is the closest I've come to an answer.

HttpHandler Property Injection using Ninject returning null

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

迷鸟归林 2024-10-15 09:57:15

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

否则,您自己的 HttpHandlerBase 将需要自行调用 Kernel.Inject 。内核引用可以通过应用程序范围或通过反射来获取。

HttpApplication.CreateKernel() 中,将应用程序范围中的内核实例存储为“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 );
    }
}

If you build Ninject.Web.Mvc from source, include a copy of the HttpHandlerBase class from Ninject.Web in the Ninject.Web.Mvc namespace.

Otherwise your own HttpHandlerBase will need to call Kernel.Inject on itself. The kernel reference can be obtained via Application scope, or via reflection.

In HttpApplication.CreateKernel() store the kernel instance in the Application scope as "NinjectKernel". Then add the following as your IHttpHandler base class.

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 );
    }
}

The reflection approach does not require any code in your 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 );
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文