gpt4 book ai didi

design-patterns - 依赖注入(inject) : How To Overcome Cyclic Dependencies

转载 作者:行者123 更新时间:2023-12-04 18:16:36 24 4
gpt4 key购买 nike

谢谢阅读。

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

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

我的案例

好吧,让我们想象一下 3 个服务 ServiceSally、ServiceJoe、ServiceJudy

ServiceSally 依赖于 ServiceJoe

ServiceJoe 依赖于 ServiceJudy

ServiceJudy 依赖于 ServiceSally(<< 这有点奇怪,不是吗?)

因此,如果您实例化 ServiceSally,她将需要注入(inject) ServiceJoe,而 ServiceJoe 将需要 ServiceJudy 并且......砰!...... ServiceJudy 将需要 ServiceSally 开始一个无休止的循环 - 以及非常悲伤的三角恋 -。

我该如何解决这个 cyclic-loveTriangle 案例? :/

更新:

我的第一个解决方案:LazyJoe

如何使用服务引用的包装器来延迟注入(inject),直到它们被使用?

你怎么看?

最佳答案

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

  • 创建 ServiceSally
  • 创建ServiceJoe
  • 创建服务Judy
  • 初始化服务Judy
  • 将 ServiceJudy 注入(inject) ServiceJoe
  • 初始化 ServiceJoe
  • 将 ServiceJoe 注入(inject) ServiceSally
  • 初始化 ServiceSally
  • 将 ServiceSally 注入(inject) ServiceJudy
  • 告诉 ServiceJoe、ServiceJudy 和 ServiceSally 他们准备好了

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

    一般来说,至少根据我的经验,循环依赖是设计在某些方面存在缺陷或需要简化的症状。

    关于design-patterns - 依赖注入(inject) : How To Overcome Cyclic Dependencies,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2258988/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com