7

コードを書くとき、オブジェクトの 2 つの大きなグループを識別できるはずです。

  • 注射剤
  • ニューエイブル

http://www.loosecouplings.com/2011/01/how-to-write-testable-code-overview.html

http://misko.hevery.com/2008/09/30/to-new-or-not-to-new/

  • 注入可能オブジェクトは、コンストラクターで依存関係を公開するオブジェクト (サービス) です。これらの依存関係は通常、IoC コンテナーを使用して解決されます。これらのオブジェクトは、コンストラクターで他の注入可能オブジェクトのみを要求できます。

  • Newable はコンストラクターで依存関係を公開するオブジェクトですが、newable は他の newable オブジェクト (エンティティ、値オブジェクト) のみを要求できます。newable オブジェクトのもう 1 つの特徴は、注入可能なオブジェクトへの参照を保持してはならないことです。

しかし、コードを書くとき、多くの場合、サービス (注入可能) をエンティティ (新規可能) に「注入」する必要があります。

newable オブジェクトでサービスの依存関係を公開する方がメソッド レベルで行うほうがよいのではないかと考えていましたが、これはやるべきことがたくさんあるように思えます....メソッドが呼び出されるたびに依存関係を解決することを考えているだけです... . これは、Service Locator アンチパターンを使用する必要があるように思えます。

私がこれを解決した方法は次のとおりです。

  • 依存関係を公開するメソッドを使用してインターフェイスを作成します (サービスはこのメソッドで使用されます)

  • インターフェイスの拡張メソッドを作成し、別の名前空間、おそらく別のアセンブリに配置し、サービス ロケーターを使用して依存関係を解決する元のメソッドへの呼び出しをラップするだけです。

これを行うことで、newable オブジェクトと注入可能オブジェクトを一貫して分離し、newables でサービスを簡単に使用できるようになります。

  • どう思いますか?
  • 拡張メソッドでサービス ロケーターを使用することは悪い習慣と見なされますか?
  • 拡張メソッドの呼び出しをどのように単体テストしますか?
4

1 に答える 1

3

しかし、コードを書くとき、多くの場合、サービス (注入可能) をエンティティ (新規可能) に「注入」する必要があります。

これは当てはまりません。これを行う必要がある場合は、サービスにあるはずのエンティティにいくつかの機能が存在します。

あなたの newable がShoppingCart、あなたの injectable が database であるとしましょうrepository。あなたはこれを行うことができるようにしたい:

// somehow cart already got the repository
cart.save();

まあ、あなたはそれを間違っています。代わりに、物事を切り替えて行う必要があります。

respository.save( cart );

これを行う必要があると感じる状況を提供していただければ、その状況の詳細について話し合うことができます。

于 2015-10-08T05:06:50.500 に答える