如何使用ninject在HttpModule中注入依赖项?

Che*_*hev 9 c# asp.net dependency-injection webforms ninject

我们正在我的公司运行一个webforms项目,我有一个HttpModule,我需要解决它的依赖关系.

我们使用Ninject.Web库来解析母版页,页面,用户控件,Web服务和HttpHandler的依赖关系.所有这些都有可以在Ninject.Web命名空间中继承的基类:

  • MasterPageBase
  • PageBase
  • WebServiceBase
  • HttpHandlerBase
  • 我们添加了一个自定义的,因为一些奇怪的原因它不存在:UserControlBase

但是我无法找到HttpModuleBase.有一个NinjectHttpModule,但它不是一个基类,它是一个真正的模块,试图消除从页面和用户控件中的基类继承的需要,但它有一些错误,我们没有使用它.

在HttpModule中解决依赖关系的最佳方法是什么?

当我谷歌这个我在第一页提出这个问题-_-

Str*_*ior 12

Phil Haack在博客中介绍了一种方法,可以使用构造函数注入,从而避免让HttpModule直接依赖于Ninject.在标准中NinjectHttpApplication,执行以下操作:

步骤1

使用Nuget查找并将HttpModuleMagic包添加到您的Web项目中.

第2步

写你HttpModule的使用构造函数注入:

public class MyHttpModule : IHttpModule
{
    public MyHttpModule(ISomeService someService) {...}
}
Run Code Online (Sandbox Code Playgroud)

第3步

从web.config中删除 http模块:

<httpModules>
    <!-- Modules will be defined via DI bindings -->
</httpModules>
Run Code Online (Sandbox Code Playgroud)

第4步

设置绑定:

Bind<IHttpModule>().To<MyHttpModule>();
// Repeat the pattern above for any other modules.
Run Code Online (Sandbox Code Playgroud)

  • 有关此事的注意事项(好像有些谷歌的'Ninject http模块'这是第一次点击).如果您使用的是Ninject.Web.Common,则不需要引用HttpModuleMagic,因为它们都做同样的事情.如果引用了HttpModuleMagic,它将导致模块中的Init()方法触发两次 (6认同)
  • @Ben这是正确的.在这个问题的时候,Ninject.Web.Common中没有HttpModuleBase类,但现在似乎有一个. (2认同)

Che*_*hev 3

我有点惊讶一整天都没有人回答这个问题!看来我难倒了你们:)

嗯,我解决了这个问题。我自己编写了自己的自定义实现IHttpModule并将其编译到 Ninject.Web 程序集中。这是我添加的基类的来源:

namespace Ninject.Web
{
    public class HttpModuleBase : IHttpModule
    {
        /// <summary>
        /// This method is unused by the base class.
        /// </summary>
        public virtual void Dispose()
        {

        }

        /// <summary>
        /// Ininitialize the module and request injection.
        /// </summary>
        /// <param name="context"></param>
        public virtual void Init(HttpApplication context)
        {
            RequestActivation();
        }

        /// <summary>
        /// Asks the kernel to inject this instance.
        /// </summary>
        protected virtual void RequestActivation()
        {
            KernelContainer.Inject(this);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我只是根据 Ninject.Web 程序集中的其他基类对其进行建模。它似乎工作得很好。只需让您的 HttpModule 继承Ninject.Web.HttpModuleBase,然后您就可以在模块中自由使用属性注入,如下所示:

public class AppOfflineHttpModule : HttpModuleBase
{
    [Inject]
    public IUtilitiesController utilitiesController { get; set; }

    ...
}
Run Code Online (Sandbox Code Playgroud)