循环依赖和 Unity 容器
Circular Dependency and Unity Container
我有一个解决方案:
Business
引用了 Business.Interfaces
、DataAccess.Interfaces
和 Factory
(用于解析 DataAccess.Interfaces
中的 IDataAccess
)
MainProject
引用了 Business.Interfaces
和 Factory
(用于解析 Business.Interfaces
中的 IBusiness
)
我的工厂项目使用 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 以直观地了解其工作原理。您的应用程序看起来像第一张图片 很多 - 您应该努力让它像第二张图片一样。该应用程序逻辑上设置在相互依赖的不同层中,但它物理上非常扁平。
我有一个解决方案:
Business
引用了Business.Interfaces
、DataAccess.Interfaces
和Factory
(用于解析DataAccess.Interfaces
中的IDataAccess
)MainProject
引用了Business.Interfaces
和Factory
(用于解析Business.Interfaces
中的IBusiness
)
我的工厂项目使用 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 以直观地了解其工作原理。您的应用程序看起来像第一张图片 很多 - 您应该努力让它像第二张图片一样。该应用程序逻辑上设置在相互依赖的不同层中,但它物理上非常扁平。