我有一个解决方案:
Business
引用了Business.Interfaces
,DataAccess.Interfaces
和Factory
(对于IDataAccess
中的解析DataAccess.Interfaces
)MainProject
引用Business.Interfaces
和Factory
(IBusiness
中的解析Business.Interfaces
)我的工厂项目使用Unity
来解决依赖关系。该项目必须引用除MainProject
之外的所有其他项目,以访问具体类的构造函数,并在类和接口之间进行映射。
但我没有在Business
项目中添加对Factory
的引用,因为Visual Studio对我说:
无法添加对商家的引用。添加此项目作为参考将导致循环依赖
如何解决这个问题?
答案 0 :(得分:2)
一种方法是重新组织你的项目。
我会彻底摆脱Factory
项目。如果您所做的只是解决依赖关系,那么您可以在MainProject
中执行此操作,因为这是唯一需要知道如何映射事物的人。
Business
不应该关心任何具体的实现,假设它只是实现您的业务逻辑。它只适用于抽象,而不是具体的类。
简而言之,Business
只依赖于Interfaces
项目,Factory
已经消失,所有Unity映射都在MainProject
中完成。 MainProject
是唯一引用所有其他项目的人。
答案 1 :(得分:1)
正如@Andrei指出的那样,在配置应用程序以使用DI时,应用程序应该负责在其Composition Root中连接所有依赖项。
组合根是应用程序中(最好)唯一的位置,其中模块组合在一起。
此外,组合根应 不 移动到外部库。将组合根视为.config
文件的现代代码替代品。 应用程序负责加载它并将其内容提供给依赖程序集 - 对于组合根也是如此。
组合根的工作是将依赖关系推送到应用程序的其余部分。依赖程序集不应该尝试拉它们自己的依赖项。它被称为好莱坞原则 - "别打电话给我们,我们会打电话给你"。也就是说,将abstract factory pattern与DI结合使用也很常见。
请参阅this answer,了解它应如何运作。您的应用程序看起来像第一张图像一样很多 - 您的目标应该是像第二张图像一样。应用程序逻辑设置在彼此依赖的单独层中,但物理上非常平坦。