Asp.net
將 IoC 依賴注入自定義 HTTP 模組 - 如何?(ASP.NET)
我有一個自定義 HTTP 模組。我想使用我的 IoC 框架注入記錄器,這樣我就可以在模組中記錄錯誤。但是,我當然沒有建構子,所以不能將它注入其中。解決這個問題的最佳方法是什麼?
如果您需要特定的 IoC 容器 - 我目前正在使用 Windsor,但可能很快會轉向 AutoFac。
謝謝
我剛剛在我的部落格上回答了這個問題。
另請參閱http://lozanotek.com/blog/archive/2009/08/19/Autowire_IHttpModules_with_IoC.aspx
我第一次在 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; } } }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訪問根容器。