La respuesta que menciona interfaces es correcta, pero si necesita poder crear ambos tipos de ambos proyectos, tendrá que crear una fábrica en otro proyecto (que también haría referencia al proyecto de interfaces pero podría ser referenciado por sus dos proyectos principales) o cambiar significativamente la estructura que está usando.
Algo como esto debería funcionar:
Finance: References Billing, Interfaces, Factory
Billing: References Finance, Interfaces, Factory
Factory: References Interfaces
fábrica tendría un BillingFactory.CreateInstance() As Interfaces.IBilling
y también en la clase abstracta de facturación que implementan Interfaces.IBilling.
El único problema que puedo ver es si necesita hacer algo inteligente al crear un objeto y no desea que esa lógica termine en un proyecto separado, pero como no ha mencionado ninguna lógica inteligente para crear instancias, esto debería ser suficiente
Si bien puede emplear varios trucos ya mencionados, esto suena como un problema arquitectónico. ¿Cómo se hace una distinción entre Facturación y Financiera? Me parece algo difícil trazar una línea aquí, y mi sensación es "financiera" nunca debería referirse a la facturación, porque es mucho menos abstracta. ¿Es posible que algunos elementos residan en el proyecto equivocado? ¿Qué es exactamente "demasiado grande"? – mnemosyn
Eso es solo un ejemplo. La intención es saber cómo crear un ERP siguiendo buenas prácticas de OOP ya que las referencias circulares son muy comunes en ese tipo de software porque es muy grande y se divide en muchos módulos. – Eduardo
Las referencias circulares provienen de un diseño defectuoso, no de la complejidad del dominio. Sin juego de palabras, no estoy diciendo que esta es la situación aquí. Los ERP no son algo que pueda desarrollar a medida que avanza por el camino, necesita tener una imagen muy clara de lo que está tratando de lograr mucho antes de escribir una sola línea de código. – devnull