4

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

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

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

这对于类隔离和可测试性非常有用。但我们不是只是将 UI 和业务层与恰好使用关系数据库的数据层的特定实现结合起来吗?

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

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

4

1 回答 1

3

坦率地说,您应该做的是创建一个通用接口来访问您的数据。一个Repository,然后创建这个接口的Sql Implementation,不要注入你的SqlConnection。

这样,在测试中,您只需将通用接口的 SqlImplementation 替换为测试实现(模拟)即可。

我认为您对 DI 的研究太过分了。在 Sql 实现的情况下,您可能应该注入连接字符串,而不是 SqlConnection 本身。

于 2010-05-27T23:44:55.293 回答