2012-01-17 7 views
9

通常、1つ以上のサービスを別のサービスに注入する必要があるときは、それぞれを明示的に注入します。しかし、私は、サービスコンテナ自体を注入することによって、実際の作業がより簡単になるという状況があります。私はこれが推奨される習慣ではないことを知っていますが、私は技術的な理由がこれを落胆させることであるのは不思議です。それはあまりにもリソースを集中しているような正当な何か、またはそれはあまりにも面倒なより個人的な感じですか?個々のサービスの代わりにサービスコンテナを注入しないようにする技術的な理由は何ですか?

答えて

13

コンテナを注入する場合は、依存関係をクリアしていません。実際、あなたは以前よりもそれらをあいまいにしています。あなたはこのようなクラスを持っている場合は...

class DocumentCreator(IFileNamer fileNamer, IRepository repository) 
{ ... } 

...あなたは依存関係が何であるかを見ることができます。また、単体テストのためにそれらの依存関係を簡単に疑似して、DocumentCreatorを分離し、テストの失敗がその依存関係の1つではなくコードの結果であることを知ることができます。

場合は、他の一方で、あなたがこれを行う...

class DocumentCreator(IDependencyContainer container) 
{ ... } 

は...あなたは依存関係を曖昧にしました。あなたは、クラスの内部を調べることなく、IFileNamerとIRepositoryが必要であることを知ることはできません。

DocumentCreatorをテストするために、コンテナに入れる必要のある模様を簡単に知ることはできません。 IDependencyContainerを嘲笑しても、あなたを助けません。 IForeNamerとIRepositoryがコンテナに含まれないため、クラスの内部を調べて必要がないことを確認しない限り、クラスはテストに失敗します。

4

私はこのアプローチの主な問題は、もはや依存関係をはっきりと見ないということです。別の問題は、テストするのがより難しいことかもしれません。

+0

私は間違いなく最初の部分に同意します。それはまれな状況を除いて、私はまだ特定のサービスを注入し続けています。しかし、どのようにテストするのがより難しいか分かりません。 –

+1

これは、コンテナオブジェクトを作成し、それを直接注入するのではなく、モックされた(またはモックされていない)サービスを注入することを意味します。 – greg0ire

+0

ええ、それは間違いなく大きな欠点です。 –

3

あなたが説明するものはServiceLocatorです。これは、最新のアプリケーション設計における反パターンと考えられています。なぜThis articleに記載されています。

+0

False。人々は本当にその男のブログへのリンクを停止する必要があります。より熟練したパターンマスターからの洞察がここにあります。 http://www.martinfowler.com/articles/injection.html – Colin

+1

@Colin Mark SeemannがServiceLocatorをアンチパターンと宣言した理由を読んだことはありますか?完全な依存性注入のメリットのほんのわずかしか得られませんが、かなりのメリットがあります(つまり、依存性の即座の可視性)。私はSLがカプセル化のようなソフトウェア設計のさまざまなルールに違反しているhttp://blog.ploeh.dk/2015/10/26/service-locator-violates-encapsulation/またはSOLID http://blog.ploeh.dk/2014/05/15/service-locator-violates-solid/ –

+0

はい、それはナンセンスです。実際、彼の主張の反対は真実です。例えば、彼は "カプセル化を台無しにする"と言っていますが、カプセル化の全体のポイントは、呼び出し側が気にしてはならないクラスの内部の詳細を隠すことです(例では外部化します)。 DIには明確なアプリケーションと利点がありますが、それは「ゴールデンハンマー」ではありません。それは反パターンです。 Trace.WriteLine()またはDebug.WriteLine()を呼び出すたびにTraceListenersを渡す必要があるかどうかを考えてください!私は人々がSeeman氏を専門家のように扱うのを止めることを望む。彼はちょうど有名なブロガーです。 – Colin

関連する問題