私は依存性注入が必要な実際の世界のケースを持っています:
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 をモック/偽造する必要があります。
ここでの注入の必要性は、論理的というよりも技術的なものでしたが、この種の現実世界のシナリオは要点を理解するのに役立つと思います.