我正在尝试为自己定义一些依赖注入指南。在为要通过构造函数或 setter 注入注入的类定义依赖项时,正确的粒度应该是多少?该类可以是服务、存储库等。假设有一个存储库类,如下所示:
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 依赖项) 这是存储库类的最小依赖项。从消费者的角度来看,此构造函数是正确的选择,但从单元测试的角度来看,它不适合,因为 DataSource 在存储库实现中由 SqlSessionTemplate 内部使用。
Options-B (SqlSession 依赖) 从单元测试的角度来看,这是正确的选择,但从消费者的角度来看,这是正确的选择。此外,存储库实现与 SqlSessionTemplate 接口的特定实现紧密耦合。因此,如果消费者通过 SqlSessionTemplate 以外的一些不同的 SqlSession 接口,它将不起作用。
Options-C(SqlSessionTemplate 依赖项) SqlSessionTemplate 作为实现而不是接口似乎不适合单元测试。此外,与 DataSource 相比,实例化 SqlSessionTemplate 对消费者不利。因此放弃了这个选项。
Option-A 和 Option-B 似乎是可用的选择。但是,消费者的观点和单元测试的观点之间存在权衡,反之亦然。
我是依赖注入的新手。我向 DI 专家寻求建议。什么是正确的解决方案(如果有)?在上述情况下你会怎么做?
谢谢。