3

私は C# を使用して Dependency Injection を初めて使用するので、私の不十分な質問を許してください。とにかく、時間を投資してこの主題に関する高価な本を購入する前に、この質問を投稿したかった.

いくつかのオンライン ドキュメントを調べたところ、構成ファイルと共に依存関係コンテナーを使用すると、これを使用して、あるタイプの実装から別のタイプの実装に切り替えることができるようです。ただし、これは if/else ステートメントといくつかの構成設定によって簡単に実行できます。

あるクラスから別のクラスに変更するためだけに、このような面倒な実装を使用する利点は何ですか? 抽象パターンとファクトリ パターンの方がはるかに便利だと思います。多分私は間違っています。

4

2 に答える 2

1

私は依存性注入が必要な実際の世界のケースを持っています:

2 アセンブリ : 1 つは検索を行うときに価格を計算し (検索と呼びましょう)、2 つ目はすべてのオプションを使用して予約価格を計算します (予約と呼びましょう)。

Booking アセンブリは既に Search を参照しています (全額を計算するために初期価格を知る必要があるため)。

ただし、要件は次のとおりです。検索からの価格に、「部屋全体の清掃」などのすべての必須オプション (観光業界では必須オプションがあります) を含める必要があります。

そのため、Booking in Search への参照を取得できませんでした (循環参照のため)。そこで、依存性注入を使用することにしました。

私の検索アセンブリはインターフェイスを定義しました

public interface IAddMandatoryOptionService{
  void ChangeResultsWithMandatoryOptions(SearchResult[] results);
}

そして、Booking Assembly はこのインターフェイスを実装できます。

public class AddMandatoryOptionService : IAddMandatoryOptionService{
  public void ChangeResultsWithMandatoryOptions(SearchResult[] results){
  ...
  }
}

私の SearchService クラスは次のようになります

public class SearchService{
  public SearchService(IAddMandatoryOptionService optionService){
    this.OptionService = optionService;
  }
  public SearchResult[] Search(Filter filter){
    ...
    this.OptionService.ChangeResultsWithMandatoryOptions(results); 
    ...
    return results;
  }
}

そのため、私の Search Service は AddMandatoryOptionService クラス (および Booking アセンブリ) に依存していませんが、その機能を使用しています。適切な IAddMandatoryOptionService は、サービスを作成するときに (Application_Start または DI フレームワークを使用して) 挿入されます。

利点は次のとおりです。

  • 循環参照の問題を解決します。
  • SearchService を単体テストしたい場合は、IAddMandatoryOptionService をモック/偽造する必要があります。

ここでの注入の必要性は、論理的というよりも技術的なものでしたが、この種の現実世界のシナリオは要点を理解するのに役立つと思います.

于 2013-01-08T10:11:28.207 に答える
1

つまり、依存性注入は、クラスを疎結合できるようにするために使用されます。if else ステートメントを使用すると、クラス間に依存関係が導入されます。if else ステートメントに新しい実装を追加するときは、別の else ステートメントを追加する必要があります。

http://en.m.wikipedia.org/wiki/Dependency_injectionにはかなり良いモチベーション セクションがあるので、おそらく読んだことがあるでしょう。

おそらく、さまざまなコード例で q を完成させてください。

于 2013-01-07T20:08:21.757 に答える