8

コンストラクター注入で依存性注入フレームワークを使用する場合、オプションのパラメーターを使用することは悪い習慣と見なされますか?

例:

public class ProductsController
{
    public ProductsController(IProductService productService = null, IBackOrderService = null)
    {
    }
}

両方のパラメーターをオプションとして指定しましたが、私の DI フレームワークは常に両方の依存関係を注入します。新しい依存関係を必要とするコントローラーに新しいアクションを追加する場合、新しい依存関係をオプションにするのは悪いことですか? 既存のテストが新しい依存関係を必要としない場合でも、数十の単体テストを壊す可能性があります。

編集
人々は私の質問に混乱しているようです。Web アプリケーションで ProductsController を手動で構築することは決してありません。これは、コントローラー ファクトリ (依存関係を自動的に注入する) によって処理されます。

私が気に入らないのは、次のような単体テストを行うことです。

[Test]
public void Test1()
{
    var controller = new ProductsController(new MockProductService(), new MockBackOrderService());
}

ここで、コントローラーに新しいアクション メソッドを追加することにしました。この新しいアクションには新しい依存関係が必要ですが、既存のアクションには必要ありません。ここで、新しいパラメーターを追加したため、戻って 100 の異なる単体テストを変更する必要があります。パラメータをオプションにすることでそれを回避できますが、それが悪い考えかどうか知りたかったのです。それが影響するのは単体テストだけなので、私の直感はノーと言います。

4

3 に答える 3

6

私はそれが良い考えだとは思わない。コンストラクター注入は、依存関係が必要であることを意味します。パラメータの 1 つが null の場合にスローするガード ラインを追加することも必要です。

問題は単体テストにあると思います。たとえば、コントローラーが作成され、サポート オブジェクトがモックされる場所は 1 つだけです (controllerContext、HttpContext、Request、Response など)。次に、コンストラクターに新しいパラメーターを追加すると、単体テストで 1 か所だけ変更する必要があります。

おそらく、単体テストでジェネリック基本クラスをコーディングするか、テストの「セットアップ」ルーチンを使用することを検討する必要があります。

于 2012-04-20T20:56:14.903 に答える