我正在尝试实施依赖注入以使我的应用程序测试人员友好。我有一个相当基本的疑问。
数据层使用 SqlConnection 对象连接到 SQL 服务器数据库。SqlConnection 对象是数据访问层的依赖项。根据依赖注入的规律,我们不能 new() 依赖对象,而是通过构造函数参数接受它们。不想惹恼 DI 之神,我尽职尽责地在我的 DAL 中创建了一个接受 SqlConnection 的构造函数。
业务层调用 DAL。因此,业务层必须传入 SqlConnection。表示层调用业务层。因此,它也必须将 SqlConnection 传递给业务层。
这对于类隔离和可测试性非常有用。但我们不是只是将 UI 和业务层与恰好使用关系数据库的数据层的特定实现结合起来吗?
为什么表示层和业务层需要知道底层数据存储是 SQL?如果应用程序需要支持除 SQL 服务器之外的多个数据源(例如 XML 文件、逗号分隔文件等)怎么办?此外,如果我添加另一个我的数据层所依赖的对象(例如,第二个数据库)怎么办。现在,我必须修改上层以传入这个新对象。
我怎样才能避免这种旋转木马并在没有痛苦的情况下获得 DI 的所有好处?