Dependency injection 软件层的依赖注入和解耦
我正在尝试实现依赖注入,以使我的应用程序测试人员友好。 我有一个相当基本的疑问 数据层使用SqlConnection对象连接到SQL server数据库。 SqlConnection对象是数据访问层的依赖项。按照 依赖项注入的法则,我们不能创建新的()依赖对象,而是 通过构造函数参数接受它们。我不想打乱帝神,我 尽职尽责地在我的DAL中创建一个接受SqlConnection的构造函数 业务层调用DAL。因此,业务层必须传入SqlConnection。 表示层调用业务层。因此,它也必须在SqlConnection中传递 到业务层 这对于类隔离和可测试性非常有用。但我们不是刚刚结婚了吗 UI和业务层到数据层的特定实现 使用关系数据库 为什么表示层和业务层需要知道底层数据存储 是SQL吗?如果应用程序需要支持SQL server以外的多个数据源,该怎么办 (例如XML文件、逗号分隔的文件等)此外,如果我添加另一个对象呢 我的数据层所依赖的数据库(例如,第二个数据库)。现在,我必须 修改上层以传入此新对象Dependency injection 软件层的依赖注入和解耦,dependency-injection,decoupling,layer,Dependency Injection,Decoupling,Layer,我正在尝试实现依赖注入,以使我的应用程序测试人员友好。 我有一个相当基本的疑问 数据层使用SqlConnection对象连接到SQL server数据库。 SqlConnection对象是数据访问层的依赖项。按照 依赖项注入的法则,我们不能创建新的()依赖对象,而是 通过构造函数参数接受它们。我不想打乱帝神,我 尽职尽责地在我的DAL中创建一个接受SqlConnection的构造函数 业务层调用DAL。因此,业务层必须传入SqlConnection。 表示层调用业务层。因此,它也必须在SqlCo
我怎样才能避免这种旋转木马,并在没有痛苦的情况下获得DI的所有好处呢?坦率地说,您应该做的是创建一个用于访问数据的通用接口。一个存储库,然后创建此接口的Sql实现,并且不要注入SqlConnection 通过这种方式,在测试中,您只需将公共接口的SqlImplementation替换为测试实现(mock)即可
我觉得你钻到DI太深了。在Sql实现的情况下,您可能应该注入连接字符串,而不是SqlConnection本身。因此,您要说的是将连接到数据源所需的任何设置封装到实现IRepository接口的SqlRepository类中,并将其传播到层次结构中。并在层次结构顶部的控制器类中嵌入要选择的存储库的知识。因此,DI是通过解耦实现的,因为中间层不需要知道使用的是什么特定的存储库。这当然可以。是的,您可以制作
TestRepository
或FlatFileRepository
或DavidBowieInSpaceRepository
,然后在配置中选择所需的实现。IRepository如何工作的细节与控制器/中间层无关。这样,您还可以通过构造函数中的DI使用DI来满足特定于实现的配置。感谢您的清晰解释。如果我有这个名声的话,我会选你的。呵呵,不用担心:)很乐意帮忙。+1个很好的问题。