ドメイン駆動設計に関するいくつかの興味深い本を読むと、そのサンプルの 1 つが次のようになります。
// Order
IOrderNumberService orderNumberService;
public void Accept()
{
this.orderNumber = this.orderNumberService.GetNextAvailableNumber();
}
上記のコードに表示されていないのは、 がOrderNumberService
IoC フレームワークによって挿入されたことです。サービス オブジェクトのライフタイム スコープはわかりません (注入のたびに新しいサービスが作成されるか、毎回注入されるシングルトンが作成される可能性があります)。
データベースから次に使用可能な番号をチェックすることを仕事とするサービスの場合、状態は不要であり、Singleton を安全に (おそらく使用する必要があります) 使用できます。
この場合、このサービスを交換する必要はないと思います。シングルトン クラスの具体的な実装を直接簡単に呼び出すことができますOrderNumberService.GetNextAvailableNumber()
。少なくとも、インターフェイスで抽象化する必要がある場合は、後でいつでもリファクタリングできます。
実装からサービス インターフェイスを抽象化してテストを容易にする以外に、サービスを注入する利点はありますか?
私は、自分が読んだすべてのものを単にクールだからという理由だけでコードに入れることに慎重です。では、どの時点で抽象化によって非常に多くのレイヤーが作成され、コードが読みにくくなり、注意すべき警告サインは何ですか?