我们正在我的公司运行一个webforms项目,我有一个HttpModule,我需要解决它的依赖关系。
我们使用Ninject.Web库来解析母版页,页面,用户控件,Web服务和HttpHandler的依赖关系。所有这些都有可以在Ninject.Web命名空间中继承的基类:
但是我无法找到HttpModuleBase。有一个NinjectHttpModule,但它不是一个基类,它是一个真正的模块,试图消除从页面和用户控件中的基类继承的需要,但它有一些错误,我们没有使用它。
在HttpModule中解决依赖关系的最佳方法是什么?
当我谷歌这个时,我在第一页提出了这个问题-_-
答案 0 :(得分:12)
Phil Haack blogged关于这样做的方法,可以使用构造函数注入,从而避免让你的HttpModule直接依赖于Ninject。在标准NinjectHttpApplication
中,执行以下操作:
使用Nuget查找并将HttpModuleMagic
包添加到您的Web项目中。
编写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.
答案 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; }
...
}