If this helps someone else, here's how I implemented it as a request handler.
Here is my Startup.cs:
public class Startup { public void Configuration(IAppBuilder app) { var config = new HttpConfiguration();
Below I will show ServiceLocatorHandler.cs .
Here is my ConfigureAutofac function for completeness:
private IContainer ConfigureAutofac(HttpConfiguration config) { var builder = new ContainerBuilder(); var assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>(); builder.RegisterAssemblyModules(assemblies.ToArray()); // Register Web API classes builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); builder.RegisterWebApiFilterProvider(config); builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration); // Register the modules // ... // Create the container var container = builder.Build(); // Hook up the Web API dependency resolver var resolver = new AutofacWebApiDependencyResolver(container); config.DependencyResolver = resolver; // ... ServiceLocator.SetLocatorProvider(() => new AutofacServiceLocator(container)); return container; }
Finally, here is the handler:
public class ServiceLocatorHandler : DelegatingHandler { protected override Task<HttpResponseMessage> SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { var properties = request.Properties; var scope = properties["MS_DependencyScope"]; AutofacWebApiDependencyScope dependency_scope = scope as AutofacWebApiDependencyScope; if (dependency_scope != null && dependency_scope.LifetimeScope != null) { AutofacWebApiDependencyResolver resolver = new AutofacWebApiDependencyResolver(dependency_scope.LifetimeScope); AutofacServiceLocator asl = new AutofacServiceLocator(resolver.Container); ServiceLocator.SetLocatorProvider(() => asl); } return base.SendAsync(request, cancellationToken); } }
In my use case, I have a third-party library that uses IoC to resolve DBContext implementations through the repository template.
This library is used in other environments using different DI containers, and when using it with the default AutofacServiceLocator root AutofacServiceLocator I would either see EF caching problems with old data, or record failure, because new contexts would be created between adding an object and committing.
Many thanks to OP for helping me solve this.
source share