2013-04-20 10 views
7

最近、サービスロケータ「アンチパターン」の使用とキャッスルウィンザーの使用の違いを理解しようとしていますコンテナ。私はインターネット上のいくつかの情報を見つけました。これまでに学んだことをまとめました。an unfinished blog postサービスロケータのアンチパターンの使用とキャッスルウィンザーのコンテナの使用の違いは何ですか?

EDIT:これまで、私は依存性注入がすべて分離を保証する必要があると考えていました。しかし、どこでも私は城ウィンザーのようなコンテナの方向へのプッシュを見る。理由を明確に理解したい。Explain this to me like I'm a 6 year old :)

+0

ダイアグラムにはどのソフトウェアを使用しましたか? – devdigital

+1

yUML:http://yuml.me/ –

+2

私はここでその質問に答えようと試みました:http://blog.ploeh.dk/2011/08/25/ServiceLocatorrolesvs.mechanics –

答えて

17

面白いあなたは6歳のように説明してもらってください。ここexplanation like you were five years oldだ:)

どこでも私は、このような城ウィンザーなどの容器

の方向にプッシュを参照してください見て率直に言って、私はその理由は、ほとんどの人が実際に理解していないということだと思いますDependency Injectionとは、Inversion of Controlの概念を理解する代わりに、すでに慣れているnewキーワードの代わりになるものを探します。その後、彼らはDIコンテナを見つけ、それをサービスロケータとして使用します。残念ながら、それは非常に簡単です。

これは、my bookで、説明を単一のDIコンテナに結合することなくすべてのDI概念を説明する理由です。それは実際には本の大部分です。

サービスロケータと依存性注入はtwo fundamentally different attempts at achieving loose couplingです。 Service Locatorには多くの欠点があり、DIで提供されていない利点はありません。このため、Service Locatorにアンチパターンと呼ぶのは安全だと思います。

DIを使用するためにDIコンテナは必要ありません。実際、私はunless you take a rather sophisticated approach, it's probably better to avoid oneと言うでしょう。

+0

@MichaelKohne申し訳ありませんが、今修正されました。 –

3

サービスロケータは、Castle Windsorのようなコントロールコンテナの特定の逆転を囲むラッパーである可能性があります。ポイントは、あなたのコードが(理想的には)コンテナを参照すべき唯一の場所があなたのcomposition rootにあるということです。

コントロールコンテナを反転すると依存関係チェインがサポートされるため、コンテナからルートタイプを解決すると、すべての依存関係が挿入され、その下位の依存関係も注入されます。

実行時にさらに型を作成する場合は、コンテナが提供する依存関係チェインとコンテナのマッピングを利用する場合は、コンテナへの参照を持つこともできるファクトリを使用できます。実装とのインタフェース

3

サービスロケータを使用する場合、コードはすべてのサービスのロケータを呼び出しています。コントロールの反転を使用する場合、コンテナを呼び出す場所は1つだけです(コンポジションルート)。アプリの残りの部分はコンテナを認識しないようにしてください。

+0

「容器認識」と言ったら、「気づかない」という意味ですか? – Charleh

+0

ups "コンテナを認識してはいけません" :) –

関連する問題