我想避免依赖 MVC 的开销,所以第一个答案对我来说不太适用。
相反,我使用 Funq 注册了 PerRequest ILifetimeScope,并在解析依赖项之前解析了 ConatinerAdaptor 中的 ILifetimeScope。
public class AutofacLifetimeScopeIocAdapter : IContainerAdapter
{
private readonly Container _requestContainer;
public AutofacLifetimeScopeIocAdapter(Funq.Container requestContainer)
{
_requestContainer = requestContainer;
}
public T Resolve<T>()
{
var currentContainer = _requestContainer.Resolve<ILifetimeScope>();
return currentContainer.Resolve<T>();
}
public T TryResolve<T>()
{
var currentContainer = _requestContainer.Resolve<ILifetimeScope>();
T result;
if (currentContainer.TryResolve<T>(out result))
{
return result;
}
return default(T);
}
}
然后用这个初始化
_autofacContainerRoot = builder.Build();
IContainerAdapter adapter = new AutofacLifetimeScopeIocAdapter(container);
container.Register<ILifetimeScope>((c) => _autofacContainerRoot.BeginLifetimeScope())
.ReusedWithin(ReuseScope.Request);
container.Adapter = adapter;
然后清理
public override void OnEndRequest()
{
var currentContainer = _container.Resolve<ILifetimeScope>();
currentContainer.Dispose();
base.OnEndRequest();
}
这似乎符合 Autofac 的要求——SingleInstance、InstancePerDependency,现在是 perRequest 的 InstancePerLifetimeScope。
HostContext.Instance.Items 集合上的神话响应可能用于消除对
var currentContainer = _container.Resolve<ILifetimeScope>();
分辨率,这应该会提高性能。