Asp.net

將 IoC 依賴注入自定義 HTTP 模組 - 如何?(ASP.NET)

  • September 20, 2014

我有一個自定義 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>
  &lt;add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/&gt;
  &lt;add name="HttpModuleInjection" type="WebTest.HttpModuleInjectionModule, WebTest"/&gt;
  &lt;add name="ContainerDisposal" type="Autofac.Integration.Web.ContainerDisposalModule, Autofac.Integration.Web"/&gt;
  &lt;add name="PropertyInjection" type="Autofac.Integration.Web.PropertyInjectionModule, Autofac.Integration.Web"/&gt;
  &lt;add name="MyModule" type="WebTest.MyModule, WebTest"/&gt;
 &lt;/httpModules&gt;

我相信你可以在溫莎做類似的事情。不同之處在於您如何從HttpModuleInjectionModule訪問根容器。

引用自:https://stackoverflow.com/questions/1657473