首页 文章

依赖注入和软件层的解耦

提问于
浏览
3

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

数据层使用SqlConnection对象连接到SQL Server数据库 . SqlConnection对象是数据访问层的依赖项 . 根据依赖注入的规则,我们不能依赖new()依赖对象,而是通过构造函数参数接受它们 . 不想打扰DI众神,我在我的DAL中尽职尽责地创建了一个接受SqlConnection的构造函数 .

业务层调用DAL . 因此,业务层必须传入SqlConnection . 表示层调用业务层 . 因此它也必须将SqlConnection传递给业务层 .

这对于类隔离和可测试性非常有用 . 但是,我们是不是只将UI和Business层耦合到恰好使用关系数据库的数据层的特定实现?

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

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

1 回答

  • 3

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

    这种测试方式只需将测试实现(模拟)替换为通用接口的SqlImplementation即可 .

    我觉得你太过深入DI了 . 在Sql实现的情况下,您应该注入连接字符串,但不能注入SqlConnection本身 .

相关问题