如何使用 Ninject 在 HttpModule 中进行依赖注入?

9
我们在公司运行一个WebForms项目,我需要为其中一个HttpModule解决依赖关系。
我们使用Ninject.Web库来解决主页面、页面、用户控件、Web服务和HttpHandlers的依赖关系。所有这些都有可以继承Ninject.Web命名空间中的基类:
- MasterPageBase - PageBase - WebServiceBase - HttpHandlerBase - 以及自定义的一个:UserControlBase 然而,我找不到HttpModuleBase。有一个NinjectHttpModule,但它不是一个基类,它是一个真正的模块,试图消除在页面和用户控件中继承基类的必要性,但它有一些错误,我们没有使用它。
最好的方法是什么来解决我的HttpModule依赖关系呢?
当我谷歌搜索时,我在第一页上找到了这个问题 -_-
2个回答

12

Phil Haack 博客中介绍了一种方法,可以通过构造函数注入避免让您的 HttpModule 直接依赖于 Ninject。在标准的 NinjectHttpApplication 中,按照以下步骤操作:

第 1 步

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

第 2 步

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

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

第三步

web.config文件中删除http模块:

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

第四步

设置绑定:

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

6
需要注意的是(如果有人搜索“Ninject http module”,这将是首个搜索结果),如果您正在使用 Ninject.Web.Common,那么引用 HttpModuleMagic 就不是必要的了,因为它们都会执行相同的操作。如果引用了 HttpModuleMagic,则会导致模块中的 Init() 方法被触发两次。 - Ben
2
@Ben没错。在提问时,Ninject.Web.Common中还没有HttpModuleBase类,但现在似乎有了一个。 - Chev
1
是的,是的,是的!耶!! - Fabio Milheiro

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

    ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接