質問
過去にCastle Windsorを使用したことがあるWebアプリケーションでAutofacの使用を調査しています。
Autofacで私が本当に気に入っているのは、WindsorでDependancyResolversなどを作成するのではなく、ラムダ式を使用して動的なコンポーネントの構築を表現できることです。
1つのシナリオは、特定のコンポーネントをASP.NETセッションレベルのスコープで登録することです。 Windsorを使用して新しいLifestyleManagerを作成/ソースしましたが、Autofacを使用してこれを思いつきました。
//Register SessionContext at HTTP Session Level
builder.Register(c =>
{
HttpContext current = HttpContext.Current;
//HttpContext handes delivering the correct session
Pelagon.Violet.Core.Interfaces.SessionContext instance = current.Session["SessionContext"] as Pelagon.Violet.Core.Interfaces.SessionContext;
if (instance == null)
{
instance = c.Resolve<Pelagon.Violet.Core.Interfaces.SessionContext>();
current.Session["SessionContext"] = instance;
}
return instance;
})
.FactoryScoped();
どこかの時点で、拡張メソッドに変換できるかもしれません。 HttpContext.Current.Sessionがnullの場合、Webアプリでのみ使用する必要があるため、この実装は爆撃を受け入れます。
質問は:
Autofacでのこのような登録のベストプラクティスは何ですか。私はネストされたコンテナなどの使用について多くの言及を見てきましたが、具体的な例はなく、上記のアプローチの何が間違っているのか理解したいです(私が考えることができるのは自動廃棄物だけです)。
ありがとう。
解決
これは問題ありません。
コンポーネントに「ExternallyOwned()」をマークすると、Autofacがそのコンポーネントで Dispose()
を呼び出さないようになります。
ここでの唯一の落とし穴は、セッションスコープのコンポーネントが現在のコンテナーを介して独自の依存関係を解決し、現在の要求に属する可能性のあるものへの参照を保持できることです(たとえば)。テストします。
所属していません StackOverflow