3

私は最近、多くの依存性注入、テスト駆動開発、および単体テストを使用していて、それが好きになり始めています。

クラスでコンストラクターの依存関係を使用しているので、単体テスト用にモックの依存関係を挿入できます。

ただし、実際に本番環境でオブジェクトが必要な場合、これに対処するための最良の方法は何ですか?

DependencyInjectionContainer.Get<MyClass>()クラスを作成したい場所で使用しますか?または、DIコンテナを介してすべての依存関係を解決する、クラスの空白のコンストラクターを作成する方が理にかなっていますか?

4

1 に答える 1

2

デフォルトのコンストラクターを持つ必要はありません。

DependencyInjectionContainer.Get(someRootType)実稼働コードでは、通常、ルートタイプ(HomeControllerMVCのクラスなど)を取得するために、アプリケーションで1回だけ呼び出す必要があります。すべてのタイプはコンストラクタインジェクションを使用して作成されるため、コンテナは関連オブジェクトのグラフ全体を作成できます。したがって、本番環境の観点からは、複数のコンストラクターを用意する必要はありません。

単体テストでは通常、すべてのモックオブジェクトを挿入する必要があるため、テストでもデフォルトのコンストラクターは使用されません。一方、各テストでテスト対象クラスのコンストラクターを直接呼び出すと、コンストラクターが変更されたときにすべてのテストを変更する必要があるため、すぐにコードの保守が困難になります。代わりに、そのロジックをテストクラス内のファクトリメソッドに一元化します。このファクトリメソッドには複数のオーバーロードを含めることができるため、テストでテスト対象のクラスを簡単に作成できます。

于 2013-02-14T18:11:56.847 に答える