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 コレクションに対する Mythz の応答を使用して、
var currentContainer = _container.Resolve<ILifetimeScope>();
これにより、パフォーマンスが向上します。