加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 20:04:44 所属栏目:百科 来源:网络整理
导读:项目#1有一些项目#2引用的接口和类. 现在我想在Project#1中使用Project#2的实现,但vs.net抱怨循环依赖. 如果我在Project#1中使用依赖注入并绑定到Project#2中的实现(因为它遵守接口契约),这是否可行或者我仍然会在运行时获得循环依赖性错误消息? 解决方法
项目#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小得多,那么这将需要更少的工作量.

希望有所帮助.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读