IOC依赖注入定义HTTP模块 - 怎么样? (ASP.NET)(IoC Dependency

2019-09-03 11:37发布

我有一个自定义HTTP模块。 我想用我的IoC框架注入记录器,这样我就可以在模块中记录错误。 但是,当然,我没有得到一个构造函数,所以不能将其注入到这一点。 什么是去了解这一点的最好方法是什么?

如果您需要特定的IoC容器 - 我目前使用的温莎,但可能很快就会转移到AutoFac。

谢谢

Answer 1:

我只是回答了我的博客这个问题 。

又见http://lozanotek.com/blog/archive/2009/08/19/Autowire_IHttpModules_with_IoC.aspx



Answer 2:

我第一次看到依赖注入到Spring.NET的HttpModules(不是广告,虽然这个框架)。 这个想法是,你有依赖注入到其他应用程序级的HttpModule-S专用的HttpModule。

可惜的是当前版本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; }
  }
}

HttpModuleInjectionModule应先于其他的HttpModule-S在web.config中进行注册:

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

我敢肯定,你可以在温莎做类似的事情。 所不同的是你如何访问从HttpModuleInjectionModule根容器。



Answer 3:

你可以在需要的依赖通过由init方法传递给你的HttpApplication的情况下通过...

public class MyHttpModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        var dependency = (IDependency)context.Context.Items["dependency"];
        // consume dependency...
    }

    public void Dispose()
    {
    }
}


Answer 4:

我很好奇安德烈 - tsykunov的答案,但没有代表对此发表评论。

我试图获得舒适与国际奥委会和DI,所以我可能失去了一些东西,但不会是简单的内MyModule的使用IContainerProviderAccessor从,而不是创建另一个模块?

例如:

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

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

        var containerProviderAccessor = context as IContainerProviderAccessor;

        if (accessor != null)
        {
            IContainer container = containerProviderAccessor.ContainerProvider.ApplicationContainer;
            MyService = container.Resolve<IMyService>();
        }
    }

    private IMyService MyService { get; set; }
}


文章来源: IoC Dependency injection into Custom HTTP Module - how? (ASP.NET)