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

时间:2011-07-11 16:24:05

标签: c# asp.net dependency-injection webforms ninject

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:12)

Phil Haack blogged关于这样做的方法,可以使用构造函数注入,从而避免让你的HttpModule直接依赖于Ninject。在标准NinjectHttpApplication中,执行以下操作:

第1步

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

第2步

编写HttpModule以使用构造函数注入:

public class MyHttpModule : IHttpModule
{
    public MyHttpModule(ISomeService someService) {...}
}

第3步

从web.config中删除 http模块:

<httpModules>
    <!-- Modules will be defined via DI bindings -->
</httpModules>

第4步

设置绑定:

Bind<IHttpModule>().To<MyHttpModule>();
// Repeat the pattern above for any other modules.

答案 1 :(得分: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);
        }
    }
}

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

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

    ...
}