6

アプリケーションの周りにIoCコンテナを渡し、サービスロケータのように使用することは悪い習慣であると一般に認められています。キャッスルウィンザーでスコープライフスタイルを使用することはできますか?

私はアプリケーションのコンポジットルートでのみコンテナを使用し、Resolve()を1回呼び出す傾向があります。アプリケーションの最上位レベルのオブジェクトを解決し、コンテナに応答して、オブジェクトグラフ

城ウィンザーは最近、「使用」ブロック内でcontainer.BeginScope()を呼び出すことができるスコープ付きのライフスタイルを追加しました。この「使用する」ブロック内から、スコープのあるライフスタイルで登録されたコンポーネントを解決すると、「使用」ブロックの期間、毎回同じインスタンスが返されます。

container.Register(Component.For<A>().LifestyleScoped()); 

using (container.BeginScope()) 
{ 
    var a1 = container.Resolve<A>(); 
    var a2 = container.Resolve<A>(); 
    Assert.AreSame(a1, a2); 
} 

質問: BeginScopeは()コンテナ上の拡張メソッドであることを考えると、私は「コンテナが周りに渡されない限り、スコープのライフスタイルは、アプリケーションで使用できるか確認するために失敗する(これは私は本当にドンtはしたい)。スコープのあるライフスタイルをどこで/どのように使用できるかの例は誰にもありますか?

おかげで、

トム

+3

スコープされたライフスタイルをどのように使用する予定ですか? –

+0

こんにちはKrzystof、私はスコープライフスタイルをまだ使用する予定はありません。私はスコープのあるライフスタイルを将来どのように使いたいかという点について、いくつかの例を見たいと思っていました。 工場内でそれを使用するのは、論理的なアプローチのようです。 –

+1

これは私が必要とするものに似ているようですが、スコープ内のインスタンスをコンストラクタ、同じスコープ内のオブジェクトの依存として解決することはできません: http://stackoverflow.com/questions/25064516/dependency-injection-lifestyle- 2インスタンス間のサービス共有インスタンス - –

答えて

7

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

特定のWeb要求、TCP要求、またはユーザーセッションの範囲では、コンテナがオブジェクトを別の方法で解決したい場合があります。これはあなた自身の工場の中できれいにそうする方法です。 IoCのあらゆる用途と同様に、ビジネスロジックが登録コードに潜入するように、IoCを悪用しないよう注意しなければなりません。

+1

の合意。さらに思考と読書を行った後、一般的なコンセンサスは、コンテナがエントリポイントアセンブリ "コンポジットルート"(インストーラ/ブートストラップと工場を介して)内で使用できるが、そのコンテナを含む他のアセンブリに "漏れ"てはいけないと思われるアプリケーションドメイン。 –