如果我有这两个项目:
MyCompany.ERP.Billing
MyCompany.ERP.Financial
计费向财务请求/发送信息,反之亦然。由于两者过于庞大,因此我不想将它们放在一个项目中。 Visual Studio不允许循环引用。你会如何处理?
如果我有这两个项目:
MyCompany.ERP.Billing
MyCompany.ERP.Financial
计费向财务请求/发送信息,反之亦然。由于两者过于庞大,因此我不想将它们放在一个项目中。 Visual Studio不允许循环引用。你会如何处理?
从你的类中提取接口,并将它们放入一个核心项目中,该项目被引用于Billing
和Financial
两个项目中。然后,您可以使用这些接口在程序集之间共享数据。
这只允许您在这两个程序集之间传递对象,但您不能从另一个程序集中创建对象,因为您实际上没有引用来开始创建。如果您希望能够创建对象,则需要一个工厂,它是独立于这两个项目之外的,用于处理对象的创建。
我会将需要在Billing
和Financial
之间相互共享数据的业务逻辑提取到另一个项目中。这将使事情变得更加容易,并且将避免您采用各种技巧,导致可维护性成为噩梦。
IOrder
- 是否存在不同类型的订单?对于 IOrderItem
等也是如此 - 你的代码变得难以表达和维护。 - mnemosyn项目过于庞大不应该成为问题。您可以使用命名空间和不同的源代码文件夹来保持代码结构化。这样,循环引用就不再是问题。
Finance: References Billing, Interfaces, Factory
Billing: References Finance, Interfaces, Factory
Factory: References Interfaces
工厂将拥有BillingFactory.CreateInstance() As Interfaces.IBilling
和实现Interfaces.IBilling的抽象计费类。
我唯一能看到的问题是,如果您需要在实例化对象时执行某些聪明的操作,并且不希望将该逻辑放在单独的项目中 - 但由于您没有提到任何聪明的实例化逻辑,因此这应该足够了。
这个解决方案可能成为处理循环引用问题的一个变通方法。基本上,您可以在无法编译代码的代码周围使用#if逻辑,除非引用存在,否则不编译,并且您可以在项目文件中使用条件编译来定义仅当所需程序集存在时才定义变量。结果,在第一次从源代码下载或解决方案清理后,您必须编译两次。随后的构建/重新构建只需要像平常一样进行1次构建即可。这种方法的好处是您永远不必手动注释/取消注释#define语句。