gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:48:15 24 4
gpt4 key购买 nike

我有一个自定义 HTTP 模块。我想使用我的 IoC 框架注入(inject)记录器,这样我就可以在模块中记录错误。但是,我当然没有构造函数,所以不能将它注入(inject)其中。解决这个问题的最佳方法是什么?

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

谢谢

最佳答案

我第一次在 Spring.NET 中看到对 HttpModules 的依赖注入(inject)(虽然没有宣传这个框架)。这个想法是你有一个特殊的 HttpModule,它将依赖项注入(inject)到其他应用程序级 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; }
}
}

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>

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

关于asp.net - 将 IoC 依赖注入(inject)自定义 HTTP 模块 - 如何? (ASP.NET),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1657473/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com