Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用ninject在HttpModule中注入依赖项?_C#_Asp.net_Dependency Injection_Webforms_Ninject - Fatal编程技术网

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

C# 如何使用ninject在HttpModule中注入依赖项?,c#,asp.net,dependency-injection,webforms,ninject,C#,Asp.net,Dependency Injection,Webforms,Ninject,我们正在我的公司运行一个webforms项目,我有一个HttpModule,我需要为它解决依赖关系 我们使用Ninject.Web库来解析母版页、页面、用户控件、Web服务和HttpHandler的依赖关系。所有这些都有基类,您可以在Ninject.Web命名空间中继承它们: 主页库 页面库 WebServiceBase HttpHandlerBase 由于某种奇怪的原因,我们添加了一个自定义的:UserControlBase 但是,我找不到HttpModuleBase。有一个Ninject

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

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

  • 主页库
  • 页面库
  • WebServiceBase
  • HttpHandlerBase
  • 由于某种奇怪的原因,我们添加了一个自定义的:UserControlBase
但是,我找不到HttpModuleBase。有一个NinjectHttpModule,但它不是一个基类,它是一个真正的模块,试图消除从页面和用户控件中的基类继承的需要,但它有一些bug,我们不使用它

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


当我在谷歌上搜索这个问题时,我在第一页上就提出了这个问题--

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

我解决了这个问题。我自己编写了
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);
        }
    }
}
关于实现这一点的一种方法,它使使用构造函数注入成为可能,从而避免使您的HttpModule直接依赖于Ninject。在标准
NinjectHttpApplication
中,执行以下操作:

第一步 使用Nuget查找
HttpModuleMagic
包并将其添加到web项目中

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

public class MyHttpModule : IHttpModule
{
    public MyHttpModule(ISomeService someService) {...}
}
步骤3 从web.config中删除http模块:


步骤4 设置绑定:

Bind<IHttpModule>().To<MyHttpModule>();
// Repeat the pattern above for any other modules.
Bind().To();
//对任何其他模块重复上述模式。

需要注意的是(好像谷歌的“Ninject http模块”是第一个成功的例子)。如果您使用的是Ninject.Web.Common,则无需引用HttpModuleMagic,因为它们都执行相同的操作。如果引用了HttpModuleMagic,则会触发模块中的Init()方法twice@Ben这是正确的。在回答这个问题时,Ninject.Web.Common中没有HttpModuleBase类,但现在似乎有了一个。是的,是的,是的!是的!
Bind<IHttpModule>().To<MyHttpModule>();
// Repeat the pattern above for any other modules.