循环依赖和 Unity 容器

Circular Dependency and Unity Container

我有一个解决方案:

我的工厂项目使用 Unity 来解决依赖关系。此项目必须引用除 MainProject 之外的所有其他项目,才能访问具体 class 的构造函数并在 class 和接口之间进行映射。

但我没有在 Factory 项目中添加对 Business 的引用,因为 Visual Studio 对我说:

无法添加对 Business 的引用。添加此项目作为引用会导致循环依赖

如何解决这个问题?

一种方法是稍微重组您的项目。

我会完全摆脱 Factory 项目。如果您所做的只是解决依赖关系,那么您可以在 MainProject 中执行此操作,因为这是唯一需要知道如何映射事物的对象。 Business 不应该关心任何具体的实现,假设它所做的只是实现您的业务逻辑。让它只与抽象一起工作,而不是具体的 类.

简而言之,Business 仅依赖于 Interfaces 个项目,Factory 消失了,所有 Unity 映射都在 MainProject 中完成。 MainProject 是唯一引用所有其他项目的项目。

正如@Andrei 指出的那样,在配置 应用程序 以使用 DI 时, 应用程序 应负责连接其所有Composition Root.

中的依赖项

A Composition Root is a (preferably) unique location in an application where modules are composed together.

此外,组合根应该移动到外部库。将组合根视为 code 文件的现代替代品。 应用程序 负责加载它并将其内容提供给相关程序集 - Composition Root 也是如此。

组合根的工作是依赖项向下推送到应用程序的其余部分。依赖程序集不应尝试 拉取 它们自己的依赖项。它被称为好莱坞原则 - "Don't call us, we'll call you"。也就是说,将 abstract factory pattern 与 DI 结合使用也很常见。

请参阅 this answer 以直观地了解其工作原理。您的应用程序看起来像第一张图片 很多 - 您应该努力让它像第二张图片一样。该应用程序逻辑上设置在相互依赖的不同层中,但它物理上非常扁平。