9

アプリケーションで 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() がコンテナーの拡張メソッドであることを考えると、コンテナーが渡されない限り、アプリケーションでスコープ付きのライフスタイルを使用する方法がわかりません (これは本当にやりたくないことです)。スコープ付きライフスタイルをどこでどのように使用できるかの例はありますか?

ありがとう、

トム

4

1 に答える 1

7

使用は通常、コンテナを見ることができる工場内であると思います。Web アプリケーションについて考えてみてください。ある意味では、MVC アプリ (「ページ」) 内のコントローラーの各呼び出しは、半独立したプログラムを実行しています。その「プログラム」に独自の依存関係を解決させることは不合理ではありません。つまり、各コントローラー呼び出しは、コンテナーを使用してその依存関係を解決する必要があります。

特定の Web リクエスト、TCP リクエスト、またはユーザー セッションの範囲内で、コンテナがオブジェクトを別の方法で解決したい場合があります。これは、自分の工場の 1 つできれいに行うための方法です。IoC のすべての使用法と同様に、ビジネス ロジックが登録コードに忍び込むような悪用をしないように注意する必要があります。

于 2012-10-06T01:28:48.027 に答える