依赖注入与程序集依赖关系

时间:2015-10-11 08:13:15

标签: c# dependency-injection unity-container

说,我有以下项目结构:

Application <-> BusinessLogic <-> DataAccessLayer

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

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

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

  • DI 使用 DataAccessLayer
  • DI 使用 BusinessLogic
  • DI 使用应用
  • 应用使用 DI

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

2 个答案:

答案 0 :(得分:3)

如果要使用DI容器,则只应在Application本身中使用它,而不能在其他类库(例如BusinessLogic和DataAccessLayer)中使用它。组成对象图的应用程序中的位置称为Composition Root

引用该文章:

  

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

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

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

在我看来,如果没有DI容器(即使在应用程序层中),情况会更好,请参阅this article了解原因。

答案 1 :(得分:1)

  1. 在DL层中创建一个注册其组件的方法。
  2. 在BL层执行相同操作但也调用DL方法。
  3. 在A层执行相同操作但也调用BL方法。
  4. 这样,相对的上层与下层隔离,一切都正确登记。对于A层,它是DL甚至存在的实现细节。它只知道BL层。