我有两个项目。
项目#2 引用了项目#1
现在我需要在项目#1中引用项目#2,但是vs.net会抱怨有循环依赖关系。
有什么解决办法吗?
我有两个项目。
项目#2 引用了项目#1
现在我需要在项目#1中引用项目#2,但是vs.net会抱怨有循环依赖关系。
有什么解决办法吗?
1)您可以将常用代码重构为另一个项目,比如项目#0。
2)可以修复您的设计,这可能是正确的方法。
Uncle Bob在Packaging Principles中有一篇很好的文章,其中包括Acyclic Dependencies Principle。http://www.objectmentor.com/resources/articles/granularity.pdf阅读此文以了解循环依赖为什么不好。
重构你的项目,将共同要素提取到一个名为“项目#0”的项目中,然后将项目#1和项目#2引用该项目。
这表明你的设计存在问题。如果确实需要两个或多个类型相互感知,那么它们应该存在于同一个程序集中。
循环依赖意味着这两个项目不再是独立的(因为只构建其中一个是不可能的)。
您需要进行重构,使其仅具有单向依赖,或者将它们合并为一个项目。
每个人都会告诉你,这是一个糟糕的设计,不要这样做等等。然而有时候说起来容易做起来难,将实现移动到单独的公共代码中并不可取。
对于这种情况,可以从一个包中发出事件并在另一个包中处理它,而不是直接调用其他包。这样,您无需使第一个组件依赖于另一个组件。
如果您仍想将实现保留在单独的包中,另一种方法是从接口派生逻辑类,并在单独的包中定义这些接口。如果您有一种实例化实现的方式,例如通过依赖注入或其他手段,那么这种方法就可以使用。
不要忽视项目结构,尝试使用基于抽象的排序方式——从低层到高层。
interface IApple { void dropOnHead(IPerson person);}
interface IPerson { void eatApple(IApple apple);}
项目#1
using ProjectInterfaces;
class Apple : IApple{
void dropOnHead(IPerson person) { log("bop");}
}
Project#2
using ProjectInterfaces;
class Person : IPerson{
void dropOnHead(IApple apple) { log("crunch");}
}
我真的不是要装聪明,但更好的程序设计才是答案。