如何处理循环引用?

时间:2010-09-15 16:28:41

标签: .net visual-studio architecture circular-reference

如果我有这两个项目:

MyCompany.ERP.Billing
MyCompany.ERP.Financial

结算财务询问/发送信息,反之亦然。两者都太大了所以我不想把它们放在一个项目中。 Visual Studio不允许循环引用。你会如何处理?

4 个答案:

答案 0 :(得分:24)

从类中提取接口并将它们放入从BillingFinancial项目引用的核心项目中。然后,您可以使用这些接口在程序集之间共享数据。

这只允许你在这两个程序集之间传递对象,但是你不能从另一个创建对象,因为你实际上没有开头的引用。如果您希望能够创建对象,则需要一个工厂,在这两个项目的外部,用于处理对象创建。

我会提取需要在BillingFinancial之间来回共享数据的业务逻辑到另一个项目中。这将使事情变得更加容易,并且可以避免诉诸于使可维护性成为噩梦的各种技巧。

答案 1 :(得分:5)

项目太大不应成为问题。您可以使用命名空间和源代码的不同文件夹来构建代码。在这种情况下,循环引用不再是问题。

答案 2 :(得分:3)

提及接口的答案是正确的 - 但是如果你需要能够从两个项目中创建两种类型,你需要将工厂分成另一个项目(这也可以引用接口项目,但可能是由两个主要项目引用)或改变您正在使用的结构。

这样的事情应该有效:

Finance: References Billing, Interfaces, Factory
Billing: References Finance, Interfaces, Factory
Factory: References Interfaces

工厂将有BillingFactory.CreateInstance() As Interfaces.IBilling以及实现Interfaces.IBilling的抽象Billing类。

我能看到的唯一问题是,如果你需要在实例化一个对象时做一些聪明的事情,并且不希望那个逻辑最终出现在一个单独的项目中 - 但是你没有提到任何聪明的逻辑来实例化,这个应该足够了

答案 3 :(得分:0)

This solution可能最终成为循环引用问题的解决方法。基本上,除非引用存在,否则在代码中使用#if逻辑,除非引用存在,并且只有在需要的程序集存在时才在项目文件中使用条件编译来定义变量。因此,在首次从源代码下载或解决方案清理后,您必须编译两次。后续构建/重建仅需要正常构建1个。关于这一点的好处是你永远不必手动注释/取消注释#define语句。