通常、1つ以上のサービスを別のサービスに注入する必要があるときは、それぞれを明示的に注入します。しかし、私は、サービスコンテナ自体を注入することによって、実際の作業がより簡単になるという状況があります。私はこれが推奨される習慣ではないことを知っていますが、私は技術的な理由がこれを落胆させることであるのは不思議です。それはあまりにもリソースを集中しているような正当な何か、またはそれはあまりにも面倒なより個人的な感じですか?個々のサービスの代わりにサービスコンテナを注入しないようにする技術的な理由は何ですか?
答えて
コンテナを注入する場合は、依存関係をクリアしていません。実際、あなたは以前よりもそれらをあいまいにしています。あなたはこのようなクラスを持っている場合は...
class DocumentCreator(IFileNamer fileNamer, IRepository repository)
{ ... }
...あなたは依存関係が何であるかを見ることができます。また、単体テストのためにそれらの依存関係を簡単に疑似して、DocumentCreatorを分離し、テストの失敗がその依存関係の1つではなくコードの結果であることを知ることができます。
場合は、他の一方で、あなたがこれを行う...
class DocumentCreator(IDependencyContainer container)
{ ... }
は...あなたは依存関係を曖昧にしました。あなたは、クラスの内部を調べることなく、IFileNamerとIRepositoryが必要であることを知ることはできません。
DocumentCreatorをテストするために、コンテナに入れる必要のある模様を簡単に知ることはできません。 IDependencyContainerを嘲笑しても、あなたを助けません。 IForeNamerとIRepositoryがコンテナに含まれないため、クラスの内部を調べて必要がないことを確認しない限り、クラスはテストに失敗します。
私はこのアプローチの主な問題は、もはや依存関係をはっきりと見ないということです。別の問題は、テストするのがより難しいことかもしれません。
あなたが説明するものはServiceLocatorです。これは、最新のアプリケーション設計における反パターンと考えられています。なぜThis articleに記載されています。
False。人々は本当にその男のブログへのリンクを停止する必要があります。より熟練したパターンマスターからの洞察がここにあります。 http://www.martinfowler.com/articles/injection.html – Colin
@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/ –
はい、それはナンセンスです。実際、彼の主張の反対は真実です。例えば、彼は "カプセル化を台無しにする"と言っていますが、カプセル化の全体のポイントは、呼び出し側が気にしてはならないクラスの内部の詳細を隠すことです(例では外部化します)。 DIには明確なアプリケーションと利点がありますが、それは「ゴールデンハンマー」ではありません。それは反パターンです。 Trace.WriteLine()またはDebug.WriteLine()を呼び出すたびにTraceListenersを渡す必要があるかどうかを考えてください!私は人々がSeeman氏を専門家のように扱うのを止めることを望む。彼はちょうど有名なブロガーです。 – Colin
- 1. Javaのデフォルトパラメータがないという技術的な理由
- 2. CoreAnimation技術よりNSViewAnimationを使用する理由は何ですか?
- 3. 技術的な理由:この繰り返しは私のアイテムを見つけられないのです
- 4. PUTとPOSTの技術的な違いは何ですか?
- 5. C#で個々のアセンブリをアンロードできない理由は何ですか?
- 6. 大規模なJavaプロジェクトで、複雑なパッケージ依存関係が発生しないようにする技術的な理由はありますか?
- 7. DBNullからヌル可能型への暗黙的な変換の技術的な理由はありますか?
- 8. 使用する宣言で、別の名前で関数名にアクセスできるようにするという技術的な理由はありますか?
- 9. 技術的にs3n、s3aとs3の違いは何ですか?
- 10. C#/ Javaで抽象クラスを使用する技術的な理由
- 11. PHPの技術のような "Java Bean"はありますか?
- 12. シンジケーション形式を選択することに技術的な理由はありませんか?
- 13. Google Earthを表示するためにDelphiでTWebBrowserを使用しないという技術的な理由はありますか?
- 14. [x]の代わりにoperator.itemgetter(x)を使用する理由は何ですか?
- 15. どのような技術をリアルタイムアプリケーションを作成するには?
- 16. 大きなプロジェクトにはどのような技術がありますか?
- 17. Robot()の背後にある技術的、根本的な理由は何ですか?createScreenCapture()はとても遅いですか?
- 18. PowerShellでは、技術的には「ヘルプ」コマンドとは何ですか?
- 19. これらの宣言の技術的な違いは何ですか?
- 20. iPhone SDKのフレームアニメーション技術による最も簡単なフレームは何ですか?
- 21. は、私は技術的なインタビューにあったし、このような構造を作るように頼ま...
- 22. 技術的にはムーンライトとは何ですか?
- 23. C#:そのコードはどのような技術ですか?
- 24. iOSがCocoa Bindingsをサポートしていないという技術的/概念的な理由はありますか?
- 25. GCC技術的な詳細
- 26. 技術的な合法性
- 27. EF 5が.NET4.0で完全にサポートされていないという技術的な理由はありますか?
- 28. このようにifステートメントを注文する理由は何ですか?
- 29. iOSウェブビューとSafariモバイル用のアプリを開発する際の主な(技術的な)違いは何ですか?
- 30. Contacts.People.NOTESの代わりになるものは何ですか?
私は間違いなく最初の部分に同意します。それはまれな状況を除いて、私はまだ特定のサービスを注入し続けています。しかし、どのようにテストするのがより難しいか分かりません。 –
これは、コンテナオブジェクトを作成し、それを直接注入するのではなく、モックされた(またはモックされていない)サービスを注入することを意味します。 – greg0ire
ええ、それは間違いなく大きな欠点です。 –