Dependency injection 软件层的依赖注入和解耦

Dependency injection 软件层的依赖注入和解耦,dependency-injection,decoupling,layer,Dependency Injection,Decoupling,Layer,我正在尝试实现依赖注入,以使我的应用程序测试人员友好。 我有一个相当基本的疑问 数据层使用SqlConnection对象连接到SQL server数据库。 SqlConnection对象是数据访问层的依赖项。按照 依赖项注入的法则,我们不能创建新的()依赖对象,而是 通过构造函数参数接受它们。我不想打乱帝神,我 尽职尽责地在我的DAL中创建一个接受SqlConnection的构造函数 业务层调用DAL。因此,业务层必须传入SqlConnection。 表示层调用业务层。因此,它也必须在SqlCo

我正在尝试实现依赖注入,以使我的应用程序测试人员友好。 我有一个相当基本的疑问

数据层使用SqlConnection对象连接到SQL server数据库。 SqlConnection对象是数据访问层的依赖项。按照 依赖项注入的法则,我们不能创建新的()依赖对象,而是 通过构造函数参数接受它们。我不想打乱帝神,我 尽职尽责地在我的DAL中创建一个接受SqlConnection的构造函数

业务层调用DAL。因此,业务层必须传入SqlConnection。 表示层调用业务层。因此,它也必须在SqlConnection中传递 到业务层

这对于类隔离和可测试性非常有用。但我们不是刚刚结婚了吗 UI和业务层到数据层的特定实现 使用关系数据库

为什么表示层和业务层需要知道底层数据存储 是SQL吗?如果应用程序需要支持SQL server以外的多个数据源,该怎么办 (例如XML文件、逗号分隔的文件等)此外,如果我添加另一个对象呢 我的数据层所依赖的数据库(例如,第二个数据库)。现在,我必须 修改上层以传入此新对象


我怎样才能避免这种旋转木马,并在没有痛苦的情况下获得DI的所有好处呢?

坦率地说,您应该做的是创建一个用于访问数据的通用接口。一个存储库,然后创建此接口的Sql实现,并且不要注入SqlConnection

通过这种方式,在测试中,您只需将公共接口的SqlImplementation替换为测试实现(mock)即可


我觉得你钻到DI太深了。在Sql实现的情况下,您可能应该注入连接字符串,而不是SqlConnection本身。

因此,您要说的是将连接到数据源所需的任何设置封装到实现IRepository接口的SqlRepository类中,并将其传播到层次结构中。并在层次结构顶部的控制器类中嵌入要选择的存储库的知识。因此,DI是通过解耦实现的,因为中间层不需要知道使用的是什么特定的存储库。这当然可以。是的,您可以制作
TestRepository
FlatFileRepository
DavidBowieInSpaceRepository
,然后在配置中选择所需的实现。IRepository如何工作的细节与控制器/中间层无关。这样,您还可以通过构造函数中的DI使用DI来满足特定于实现的配置。感谢您的清晰解释。如果我有这个名声的话,我会选你的。呵呵,不用担心:)很乐意帮忙。+1个很好的问题。