アプリケーションで IoC コンテナーを渡し、それをサービス ロケーターのように使用することは、悪い習慣であると一般に認められています。
私は自分のアプリケーションの複合ルートでのみコンテナーを使用することを好み、Resolve() を 1 回呼び出す傾向があります。つまり、アプリケーションの最上位オブジェクトを解決し、コンテナーに応答して、オブジェクト グラフの下位クラスに依存関係を注入します。
Castle Windsor は最近、「using」ブロック内で container.BeginScope() を呼び出すことができるスコープ付きライフスタイルを追加しました。この「using」ブロック内から、スコープ付きライフスタイルに登録されたコンポーネントを解決すると、「using」ブロックの間、毎回同じインスタンスが返されます。
container.Register(Component.For<A>().LifestyleScoped());
using (container.BeginScope())
{
var a1 = container.Resolve<A>();
var a2 = container.Resolve<A>();
Assert.AreSame(a1, a2);
}
質問: BeginScope() がコンテナーの拡張メソッドであることを考えると、コンテナーが渡されない限り、アプリケーションでスコープ付きのライフスタイルを使用する方法がわかりません (これは本当にやりたくないことです)。スコープ付きライフスタイルをどこでどのように使用できるかの例はありますか?
ありがとう、
トム