NetworkCommunicator クラスを独自にインスタンス化する C# クラスがあります。
お気づきのように、これは C# でこれをモックしたい場合のショー ストッパーです。解決策は簡単で、インスタンス化されたクラスのコンテキスト/目的によって異なります。
- 再利用可能なコンポーネントの場合、依存関係として注入します
- 需要が発生するたびに作成する必要がある場合は、ファクトリ経由で提供します
いずれにせよ、DI が必要になります(2 番目の例の factory も自然に注入されます)。
Java では、これが依存性注入が必要な理由です。これは、このプロジェクトには重すぎます。
依存性注入は重すぎますか? DI は設計パターンであり、必要のないときに使用すると重くなります。あなたの質問は、それが必要であることを明確に示しています。おそらく、DI コンテナーはプロジェクトにとって重すぎるということでしょうか? プロジェクトの複雑さに応じて、 DI を適用する適切な方法を選択する必要があるため、これは真実かもしれません。
Greg Smith の回答で提案されているようなソリューションを適用する際に注意すべき点をもう 1 つ挙げたいと思います。基本的に、API はコンストラクターで終わります。
public TestedClass() : this(new Dependency()) ...
public TestedClass(IDependency) ...
一見すると魅力的かもしれませんが、長期的な視点を考慮すると、いくつかの問題が浮かび上がり始めます。
- 持っ
TestedClass
ている必要があります IDependency
か、それがなくてもうまくいきますか?
- デフォルト(パラメータなしのコンストラクタ) のデフォルト (適切に使用するには、実装の詳細レベルの知識が必要です)?
- 密に結合されたコンポーネントを作成します(
TestedClass
アセンブリは、他のアセンブリを参照する必要がある可能性があります-Dependency
とにかく関係がない場合でも)
これは、 Bastard Injectionなど、さまざまな名前で使用されるアンチパターンです。もちろん、これらの問題の一部は軽減される可能性があります (コンストラクターを保護/内部にする、または同じアセンブリで既定の実装を行うなど) が、アンチパターンとその長期的な影響は残ります。また、通常の DI よりも単純でも、高速でも、コードが少ないわけでもありません。
適切な DI を適用するか、アンチパターンやサード パーティのフレームワーク (MS Fakes) を使用して回避するか、どれがそれほど重くないかを自問する必要があります。