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

设计模式 – 依赖注入:如何克服循环依赖

发布时间:2020-12-14 04:57:17 所属栏目:百科 来源:网络整理
导读:谢谢阅读. 我正在使用Unity框架在我的应用程序(ASP.Net MVC)中实现依赖注入. 有时我想避免的服务之间存在一些循环依赖关系. 所以我正在寻找解决方案:) 我的情况 好吧,让我们想象3服务ServiceSally,ServiceJoe,ServiceJudy ServiceSally依赖于ServiceJoe Serv
谢谢阅读.

我正在使用Unity框架在我的应用程序(ASP.Net MVC)中实现依赖注入.
有时我想避免的服务之间存在一些循环依赖关系.

所以我正在寻找解决方案:)

我的情况

好吧,让我们想象3服务ServiceSally,ServiceJoe,ServiceJudy

ServiceSally依赖于ServiceJoe

ServiceJoe依赖于ServiceJudy

ServiceJudy依赖于ServiceSally(<<那有点奇怪不是吗?) 因此,如果您实例ServiceSally,她将需要注入ServiceJoe,而ServiceJoe将需要ServiceJudy和…. BANG!… ServiceJudy将需要ServiceSally开始无休止的循环 – 非常悲伤的三角形 – . 我怎么能解决这个循环爱三角形的情况? :/ 更新: 我的第一个解决方案:LazyJoe 如何在服务引用周围使用包装器来延迟注入,直到它们被使用为止? 你怎么看?

解决方法

这取决于您正在使用的DI框架(如果有).例如,Spring将处理这种循环依赖,只要不是每个涉及的bean(对象)都由构造函数初始化.基本上它将一个空对象注入(至少)其他bean之一,并在以后初始化它.所以序列是这样的:

>创建ServiceSally
>创建ServiceJoe
>创建一个ServiceJudy
>初始化ServiceJudy
>将ServiceJudy注入ServiceJoe
>初始化ServiceJoe
>将ServiceJoe注入ServiceSally
>初始化ServiceSally
>将ServiceSally注入ServiceJudy
>告诉ServiceJoe,ServiceJudy和ServiceSally他们已经准备好了

这就是为什么初始化构造不适用于此方法的原因(因为初始化是延迟的).这是处理它的唯一方法.好吧也许你也可以使用某种代理(临时或永久).

一般来说,至少根据我的经验,循环依赖性是设计的症状,这种设计要么以某种方式存在缺陷,要么需要简化.

(编辑:李大同)

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

    推荐文章
      热点阅读