c# – 依赖注入可以阻止循环依赖吗?

c# – 依赖注入可以阻止循环依赖吗?,第1张

概述项目#1有一些项目#2引用的接口和类. 现在我想在Project#1中使用Project#2的实现,但vs.net抱怨循环依赖. 如果我在Project#1中使用依赖注入并绑定到Project#2中的实现(因为它遵守接口契约),这是否可行或者我仍然会在运行时获得循环依赖性错误消息? 你可能用DI来解决这个问题,但你不应该这样做. 如果我理解正确,你会有这样的事情: + Assembly A 项目#1有一些项目#2引用的接口和类.

现在我想在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# – 依赖注入可以阻止循环依赖吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1225910.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存