现在我想在Project#1中使用Project#2的实现,但vs.net抱怨循环依赖.
如果我在Project#1中使用依赖注入并绑定到Project#2中的实现(因为它遵守接口契约),这是否可行或者我仍然会在运行时获得循环依赖性错误消息?
解决方法 你可能用DI来解决这个问题,但你不应该这样做.如果我理解正确,你会有这样的事情:
+ Assembly A + Assembly B | | +-- Interface IFoo +-- Class ConcreteFoo : IFoo | ^ +-- Class MyClass -->------->-------|
换句话说,你试图让MyClass引用ConcreteFoo,但你不能,因为ConcreteFoo所在的程序集B已经依赖于A中的IFoo.
这是一个设计错误.如果在程序集A中声明接口IFoo,但没有具体实现,那么程序集A中的任何其他接口/类应该只引用IFoo,而不是实现它的具体类.
有三种方法可以消除循环依赖:
>使MyClass依赖于IFoo而不是ConcreteFoo.如果你能做到这一点,这可能是最好的选择.如果问题是你需要在MyClass中使用IFoo的物理实例并且不知道从哪里获取它,那么让它在构造函数中使用IFoo – 让任何使用MyClass的人都知道要使用的IFoo.
>将接口移动到自己的程序集.这仍然是一个相当不错的做法.您的设计将如下所示:
+ Assembly App + Assembly Interfaces + Assembly Concrete | | | | +-- Interface IFoo | | | \ | +-- Class MyClass | \------+-- Class ConcreteFoo | | | ^ +---- Member Foo ->--------------------->-------------------|
>将MyClass移动到自己的程序集.有效地,您的依赖树看起来与上面的#2相同,但如果程序集A比B小得多,那么这将需要更少的工作量.
希望有所帮助.
总结以上是内存溢出为你收集整理的c# – 依赖注入可以阻止循环依赖吗?全部内容,希望文章能够帮你解决c# – 依赖注入可以阻止循环依赖吗?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)