Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 依赖注入:如何克服循环依赖_Design Patterns_Dependency Injection_Unity Container - Fatal编程技术网

Design patterns 依赖注入:如何克服循环依赖

Design patterns 依赖注入:如何克服循环依赖,design-patterns,dependency-injection,unity-container,Design Patterns,Dependency Injection,Unity Container,谢谢你的阅读 我正在使用Unity框架在我的应用程序(ASP.Net MVC)中实现依赖项注入。 有时,我希望避免服务之间存在一些循环依赖关系 所以我在寻找解决方案:) 我的案例 让我们想象三种服务Sally,ServiceJoe,ServiceJudy 服务萨利依靠服务乔 服务乔依靠服务朱迪 ServiceJudy依赖于ServiceSally(这取决于您使用的DI框架(如果有的话)。例如,只要不是每个涉及的bean(对象)都由构造函数初始化,它就会处理这种循环依赖关系。基本上,它会将空对象

谢谢你的阅读

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

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


我的案例 让我们想象三种服务Sally,ServiceJoe,ServiceJudy

服务萨利依靠服务乔

服务乔依靠服务朱迪

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

  • 创建服务Sally
  • 创建一个ServiceJoe
  • 创建一个服务judy
  • 初始化服务Judy
  • 将ServiceJudy注入ServiceJoe
  • 初始化ServiceJoe
  • 将服务Joe注入服务Sally
  • 初始化服务萨利
  • 将ServiceSally注入ServiceJudy
  • 告诉服务人员乔、服务人员朱迪和服务人员萨利他们准备好了
  • 这就是为什么构造上的初始化不能使用这种方法(因为初始化是延迟的)。这确实是处理它的唯一方法。也许你也可以使用某种代理(临时的或永久的)


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

    不要让一个服务*依赖于另一个具体的服务*。让它们依赖于一个超类或接口。然后在创建后将一个具体的服务*注入另一个服务*。我在某种程度上同意克莱特斯的观点,每当你发现自己的服务相互依赖时,是时候坐下来重新思考你的设计了


    如果你做“懒惰的DI”,你为什么要做DI?使用DI的好处之一是不必担心你的依赖项被初始化时,你只需要在你需要它们的时候把它们放在那里。

    Hi Cletus,谢谢你的回答:)+1我在使用Unity。你说得对,我认为可能需要简化。。但在项目生命周期的这一点上,它将被推迟一段时间;)尊重春天的方式做这件事。。。那么使用lazy DI是个好主意第九步。ServiceSally实例不是为ServiceJudy创建的,因为步骤3完成了所有对象创建阶段,对吗OSD”:在这种情况下,惰性DI并不是一个好主意,它只是唯一的选择。+1表示“一般来说……循环依赖性是有缺陷的设计的症状……或者需要简化。“在某些特定的、罕见的情况下,循环依赖可能是问题的最佳解决方案,但这种情况很少见。我编写了自己的依赖注入程序来处理循环依赖。也许我应该使用Spring,但是Spring对于我自己的项目来说听起来有点太“沉重”,而且我不喜欢使用xml文件来编写代码。我的注射器在这里:谢谢你的解决方案Ozan+1非常有创意:D