27

如果我有这两个项目:

MyCompany.ERP.Billing
MyCompany.ERP.Financial

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

4

4 回答 4

25

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

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

我将提取需要在另一个项目Billing之间来回共享数据的业务逻辑。Financial这将使事情变得容易得多,并且使您免于求助于使可维护性成为噩梦的各种技巧。

于 2010-09-15T16:30:54.387 回答
5

拥有太大的项目不应该是一个问题。您可以使用名称空间和源代码的不同文件夹来保持代码结构。在这种情况下,循环引用不再是问题。

于 2010-09-15T16:35:12.790 回答
3

提到接口的答案是正确的-但是如果您需要能够从两个项目中创建这两种类型,则您要么需要将工厂移植到另一个项目中(该项目也将引用接口项目,但两者都可以引用)您的主要项目)或更改您正在使用的结构。

像这样的东西应该工作:

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

Factory 将有一个BillingFactory.CreateInstance() As Interfaces.IBilling实现 Interfaces.IBilling 的抽象 Billing 类。

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

于 2010-09-15T17:20:05.013 回答
0

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

于 2015-12-03T19:31:29.110 回答