接口如何解决循环依赖?

5
如果你搜索如何解决循环依赖的问题,答案几乎总是“使用接口”。我知道这种技术可以用来使循环依赖工作,但我不明白这是如何“解决”循环依赖的。
比如说我有两个类View和Presenter,它们相互引用。现在我应用了这个“解决方案”,创建了IView和IPresenter接口。View不再引用Presenter,而是引用IPresenter;Presenter引用的是IView而不是View。
1. 我设置了需要一个IPresenter的View。 2. 要获取IPresenter的实现,我需要设置Presenter。 3. 要设置Presenter,我需要一个IView。 4. 要获取IView的实现,我需要设置View。
这个循环变得更大了,但仍然存在。View和Presenter仍然相互依赖,只是不再是“直接”的依赖关系。然而,我看到的每一个答案都绝对肯定地认为循环依赖现在已经被“解决”了。我的误解在哪里?
2个回答

4

这些循环依赖关系没有被解决。

在这种情况下,通常的解决方法是在构建之后分配依赖项。这解决了这些循环依赖所创建的问题,但并没有解决循环依赖本身。

这可能主要是语言问题,人们只是说“我解决了X和Y之间的循环依赖”,而不是“我解决了因X和Y之间的循环依赖而引起的问题”。


我完全同意这个说法。添加接口可以防止编译器看到循环依赖,但并不能解决它。 - olenz
要解决这个问题,你必须重构你的代码。没有简单的技术配方可以做到这一点。 参考:https://blog.ttulka.com/too-many-interfaces(“接口解决循环依赖”) - olenz

2

循环依赖可以使用DI解决,但只能使用"延迟"或"属性"注入,不能使用"构造函数"注入。您需要先构建对象,然后设置属性以注入依赖项。支持属性注入的DI容器可以将此细节抽象化。


1
这就是我所说的“我知道如何使用这种技术使循环依赖关系起作用”的意思。然而,这些类仍然相互依赖。 - Raphael Schmitz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接