依存性注入のガイドラインを自分で定義しようとしています。コンストラクターまたはセッター注入のいずれかを介して注入されるクラスの依存関係を定義する際に、適切な粒度はどうあるべきですか? クラスは、サービス、リポジトリなどである可能性があります。次のようなリポジトリ クラスがあるとします。
public class ProductRepository
{
//Option-A
public ProductRepository(DataSource dataSource)
{
}
//Option-B
public ProductRepository(SqlSession sqlSession)
{
}
//Option-C
public ProductRepository(SqlSessionTemplate sqlSessionTemplate)
{
}
}
上記のクラスに必要な最小限の依存関係は、DataSource インターフェイスです。リポジトリ クラスは、内部的に SqlSessionTemplate (SqlSession インターフェイスの実装) を使用します。コードに示されているように、コンストラクター インジェクションを実行するためのコンストラクターには 3 つの選択肢があります。以下は私の理解です:
Option-A (DataSource 依存関係) これは、リポジトリ クラスの最小の依存関係です。コンシューマーの観点からは、このコンストラクターは正しい選択ですが、リポジトリ実装の SqlSessionTemplate によって DataSource が内部的に消費されるため、単体テストの観点からは適切ではありません。
Options-B (SqlSession 依存) これは単体テストの観点からは正しい選択ですが、消費者の観点からはそうではありません。さらに、リポジトリの実装は、SqlSessionTemplate であるインターフェイスの特定の実装と密接に結合されています。したがって、コンシューマーが SqlSessionTemplate 以外の別の SqlSession インターフェイスを渡すと機能しません。
Options-C (SqlSessionTemplate の依存関係) SqlSessionTemplate が実装であり、インターフェイスではないことは、単体テストには適していないようです。また、SqlSessionTemplate のインスタンス化は DataSource と比較してより複雑であるため、消費者にとっては良くありません。したがって、このオプションを破棄します。
Option-A と Option-B が利用可能な選択肢のようです。ただし、消費者の視点と単体テストの視点の間にはトレードオフがあり、その逆もあります。
依存性注入は初めてです。DIの専門家にアドバイスを求めます。正しい解決策は何ですか(もしあれば)?上記の状況であなたはどうしますか?
ありがとう。