C# 如何使用ninject在HttpModule中注入依赖项?
我们正在我的公司运行一个webforms项目,我有一个HttpModule,我需要为它解决依赖关系 我们使用Ninject.Web库来解析母版页、页面、用户控件、Web服务和HttpHandler的依赖关系。所有这些都有基类,您可以在Ninject.Web命名空间中继承它们: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
- 主页库
- 页面库
- WebServiceBase
- HttpHandlerBase
- 由于某种奇怪的原因,我们添加了一个自定义的:UserControlBase
当我在谷歌上搜索这个问题时,我在第一页上就提出了这个问题--我有点惊讶,一整天都没有人回答这个问题!看来我难倒你们了:) 我解决了这个问题。我自己编写了
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.