Pierwszy raz widziałem Dependency Injection do HttpModules na wiosnę. NET (nie reklamując tego systemu). Chodzi o to, że masz specjalny moduł HttpModule, który wstrzykuje zależności do innych HttpModule-ów na poziomie aplikacji.
Niestety obecna wersja Autofac.Integration.Web nie obsługuje to, ale łatwo można zrobić samemu:
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 powinna zostać zarejestrowana zanim inny HttpModule-s w pliku 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>
Jestem pewien, że możesz robić podobne rzeczy w Windsor. Różnica polega na tym, w jaki sposób uzyskujesz dostęp do kontenera głównego z HttpModuleInjectionModule.
można użyć lokalizatora usług, przyjrzeć się tej kwestii: [różnica między wstrzykiwania zależności i lokalizatora usług wzór] (http://stackoverflow.com/questions/1557781/ whats-the-difference-between-dependency-injection-and-service-locator-patter) – FinnNk