IoC依赖注入自定义HTTP模块 - 如何?(ASP.NET)

UpT*_*eek 11 asp.net dependency-injection inversion-of-control httpmodule

我有一个自定义HTTP模块.我想使用我的IoC框架注入记录器,因此我可以在模块中记录错误.但是,当然我没有得到构造函数,因此无法将其注入其中.最好的方法是什么?

如果您需要特定的IoC容器 - 我目前正在使用Windsor,但可能很快就会转向AutoFac.

谢谢

and*_*nov 10

我第一次在Spring.NET中看到了对HttpModules的依赖注入(虽然没有宣传这个框架).这个想法是你有特殊的HttpModule,它将依赖注入其他应用程序级别的HttpModule-s.

不幸的是当前版本的Autofac.Integration.Web不支持这一点,但你可以自己轻松地做到这一点:

public class MyModule : IHttpModule
{
    public void Dispose()
    {            
    }

    public void Init(HttpApplication context)
    {
        Assert.IsNotNull(MyService);
    }        

    public IMyService MyService { get; set; }
}

public class HttpModuleInjectionModule : IHttpModule
{
    public void Dispose()
    {            
    }

    public void Init(HttpApplication context)
    {
        var containerProviderAccessor = context as IContainerProviderAccessor;

        if(containerProviderAccessor == null)
            throw new InvalidOperationException("HttpApplication should implement IContainerProviderAccessor");

        var rootContainer = containerProviderAccessor.ContainerProvider.ApplicationContainer;

        foreach (string moduleName in context.Modules.AllKeys)
            rootContainer.InjectProperties(context.Modules[moduleName]);
    }
}

public class Global : HttpApplication, IContainerProviderAccessor
{
  static IContainerProvider _containerProvider;

  protected void Application_Start(object sender, EventArgs e)
  {
    var builder = new ContainerBuilder();
    builder.Register<MyService>().As<IMyService>();
    _containerProvider = new ContainerProvider(builder.Build());
  }

  public IContainerProvider ContainerProvider
  {
    get { return _containerProvider; }
  }
}
Run Code Online (Sandbox Code Playgroud)

HttpModuleInjectionModule应该在web.config中的其他HttpModule-s之前注册:

  <httpModules>
   <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
   <add name="HttpModuleInjection" type="WebTest.HttpModuleInjectionModule, WebTest"/>
   <add name="ContainerDisposal" type="Autofac.Integration.Web.ContainerDisposalModule, Autofac.Integration.Web"/>
   <add name="PropertyInjection" type="Autofac.Integration.Web.PropertyInjectionModule, Autofac.Integration.Web"/>
   <add name="MyModule" type="WebTest.MyModule, WebTest"/>
  </httpModules>
Run Code Online (Sandbox Code Playgroud)

我相信你能在温莎做类似的事情.不同之处在于您如何从HttpModuleInjectionModule访问根容器.