dependency injection与程序集依赖关系

说,我有以下项目结构:

Application  BusinessLogic  DataAccessLayer 

我已准备好使用穷人dependency injection的所有类型,现在我想用Unity引入真实的类型。 但是我在努力放置依赖容器及其配置的位置(我想我会从代码中配置它)。

  • DataAccessLayer需要注册Context(EF)
  • BusinessLogic需要注册数据存储库(使用上下文)
  • 应用程序需要注册服务(使用存储库)

目前,使用容器实际实例化类的唯一程序集将是Application。 所以我有以下依赖关系图:

  • DI使用DataAccessLayer
  • DI使用BusinessLogic
  • DI使用Application
  • 应用程序使用DI

我在这里有循环引用,所以将DI放在Application中似乎是合法的。 但是我必须引用DataAccessLayer ,这是我不想创建的依赖项。 我该如何解决这个问题?

如果您想使用DI容器,那么您应该只在Application本身中使用它,而不是在其他类库中使用它(例如BusinessLogic和DataAccessLayer)。 组成对象图的应用程序中的位置称为组合根 。

引用该文章:

只有应用程序应具有组合根。 图书馆和框架不应该。

既然你已经准备好了你的课程来帮助穷人DI(现在称为Pure DI ),你应该没问题。 DI现已在您的库中启用(请注意DI和DI容器是不同的东西)。

您的应用程序现在可以从所有类库中连接所有类,即使这意味着您的应用程序项目将需要引用所有其他类库。

在我看来 ,如果没有DI容器(即使在应用程序层),你会更好,看看这篇文章的原因。

  1. 在DL层中创建一个注册其组件的方法。
  2. 在BL层执行相同操作但也调用DL方法。
  3. 在A层执行相同但也调用BL方法。

这样,相对较高的层与较低层隔离,并且一切都被正确记录。 对于A层,它是DL甚至存在的实现细节。 它只知道BL层。