How to use Autofac with WCF Web API
The new configuration model in the latest WCF Web APIs allows extending the service instantiation via what is called a resource factory.
For Autofac, I wanted to support a per-request lifetime scope, so I used the concept of instance context extensions in the Web APIs to place our scope so that it can be disposed on release.
public class AutofacResourceFactory : IResourceFactory
{
private IContainer container;
public AutofacResourceFactory(IContainer container)
{
this.container = container;
}
public object GetInstance(Type serviceType, InstanceContext instanceContext, HttpRequestMessage request)
{
// Begin lifetime scope when the service is instantiated.
var lifetime = this.container.BeginLifetimeScope();
// Hold the lifetime as an extension in the instance context
instanceContext.Extensions.Add(new AutofactLifetimeExtension(lifetime));
return lifetime.Resolve(serviceType);
}
public void ReleaseInstance(System.ServiceModel.InstanceContext instanceContext, object service)
{
var extension = instanceContext.Extensions.OfType<AutofactLifetimeExtension>().FirstOrDefault();
// If we find our extension there, dispose it so the lifetime gets disposed.
if (extension != null)
extension.Dispose();
}
private class AutofactLifetimeExtension : IExtension<InstanceContext>, IDisposable
{
private ILifetimeScope lifetime;
private bool isDisposed;
public AutofactLifetimeExtension(ILifetimeScope lifetime)
{
this.lifetime = lifetime;
}
public void Attach(InstanceContext owner)
{
}
public void Detach(InstanceContext owner)
{
Dispose();
}
public void Dispose()
{
if (this.isDisposed)
return;
this.lifetime.Dispose();
this.isDisposed = true;
}
}
}...