我正在尝试实施依赖注入以使我的应用测试人员友好。 我有一个相当基本的怀疑。
数据层使用SqlConnection对象连接到SQL Server数据库。 SqlConnection对象是数据访问层的依赖项。依据 依赖注入的规律,我们必须不是new()依赖对象,而是 通过构造函数参数接受它们。我不想打扰DI众神 在我的DAL中尽职尽责地创建一个接受SqlConnection的构造函数。
业务层调用DAL。因此,业务层必须传入SqlConnection。 表示层调用业务层。因此它也必须传入SqlConnection 到业务层。
这对于类隔离和可测试性非常有用。但是我们不是只是结合了 UI和业务层到发生的数据层的特定实现 使用关系数据库?
为什么Presentation和Business层需要知道底层数据存储 是SQL吗?如果应用程序需要支持除SQL Server之外的多个数据源,该怎么办? (例如XML文件,逗号分隔文件等)此外,如果我添加另一个对象该怎么办 我的数据层依赖于(例如,第二个数据库)。现在,我必须 修改上层以传入此新对象。
如何避免这种旋转木马并在没有痛苦的情况下获得DI的所有好处?
答案 0 :(得分:3)
坦率地说,您应该做的是创建一个用于访问数据的通用接口。一个Repository,然后创建一个这个接口的Sql Implementation,并且不要注入你的SqlConnection。
这种测试方式只需将测试实现(模拟)替换为通用接口的SqlImplementation即可。
我认为你太过深入DI了。在Sql实现的情况下,您应该注入连接字符串,但不能注入SqlConnection本身。