循环依赖与统一容器

时间:2017-02-05 22:07:49

标签: c# dependency-injection unity-container

我有一个解决方案:

solution

  • Business引用了Business.InterfacesDataAccess.InterfacesFactory(对于IDataAccess中的解析DataAccess.Interfaces
  • MainProject引用Business.InterfacesFactoryIBusiness中的解析Business.Interfaces

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

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

无法添加对商家的引用。添加此项目作为参考将导致循环依赖

如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

一种方法是重新组织你的项目。

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

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

答案 1 :(得分:1)

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

  

组合根是应用程序中(最好)唯一的位置,其中模块组合在一起。

此外,组合根应 移动到外部库。将组合根视为.config文件的现代代码替代品。 应用程序负责加载它并将其内容提供给依赖程序集 - 对于组合根也是如此。

组合根的工作是依赖关系推送到应用程序的其余部分。依赖程序集不应该尝试它们自己的依赖项。它被称为好莱坞原则 - "别打电话给我们,我们会打电话给你"。也就是说,将abstract factory pattern与DI结合使用也很常见。

请参阅this answer,了解它应如何运作。您的应用程序看起来像第一张图像一样很多 - 您的目标应该是像第二张图像一样。应用程序逻辑设置在彼此依赖的单独层中,但物理上非常平坦。