我对概念依赖注入相对较新,所以我不确定它如何防止循环依赖。假设我已经关注了项目(示例项目结构可能不太好但请耐心等待)
项目A:
- 域层
- IRepository
项目B:
- RepositoryImpl - >实现IRepository接口
在这种情况下,项目B将需要引用项目A.但是要设置项目A,假设Unity容器,项目A将需要引用项目B,以便在Unity配置中具有类似的内容。
container.RegisterType<IRepository, Repository>();
但这不会引入循环依赖吗?或者是我在依赖注入或循环依赖中有错误的理解?甚至两个?
答案 0 :(得分:2)
这里缺少一个重要的概念,即组合根的概念。可以找到关于组合根的最佳和最精细的描述here。总结一下:
组合根是应用程序中(最好)唯一的位置,其中模块组合在一起。
正如文章所解释的那样:
大多数类使用构造函数注入。通过这样做,他们将创建依赖关系的责任推到了他们的消费者身上。那个消费者 - 同样也在推动创建依赖关系的责任。
我们无法无限期地延迟创建我们的课程。必须有一个我们创建对象图的位置。您应该将此创建集中在应用程序的单个区域中。这个地方叫做 Composition Root 。
只有应用程序的入口点包含一个Composition Root,应用程序中的任何其他库都不包含。
这意味着域层本身不会将其类型注册到DI容器中 - 只有启动项目执行此操作。执行此操作时,域层将不必须依赖数据访问库(您的项目B)。
.NET中的依赖注入一书的first版本(第2章)和second edition(第3章)都包含对非常接近的示例的精心讨论到您问题中给出的应用程序结构。之前引用的Composition Root文章是第二版的摘录。第一篇文章可以免费阅读online,可以从book's homepage下载为PDF格式。