接口如何解决循环依赖?
How do interfaces solve circular dependencies?
如果您搜索如何解决循环依赖,答案几乎总是 "use interfaces"。我知道这种技术如何用于使循环依赖起作用,但我不明白这是如何解决循环依赖的。
假设我有 2 个 类 View 和 Presenter,它们相互引用。现在我应用 "solution" 并创建接口 IView 和 IPresenter。 View不再引用Presenter,而是IPresenter; Presenter 引用 IView 而不是 View。
- 我设置了 View,它需要一个 IPresenter。
- 要实现 IPresenter,我需要设置 Presenter。
- 要设置 Presenter,我需要一个 IView。
- 要实现 IView,我需要设置视图。
圈子变大了,但还在。 View 和 Presenter 仍然相互依赖,只是不直接。但是,我看到的每个答案都绝对确定循环依赖现在 已解决 。我这里有什么误会?
可以使用 DI 解决循环依赖,但只能使用 "delayed" 或 "property" 注入,而不是 "constructor" 注入。您需要先构建对象,然后在它们上设置属性以注入依赖项。支持 属性 注入的 DI 容器可以抽象掉这些细节。
这些循环依赖没有被解决。
这些情况的标准答案是在构建之后分配依赖。这解决了这些循环依赖性产生的问题,但没有解决循环依赖性本身。
这可能主要是语言问题,人们只说 "I solved the circular dependency between X and Y" 而不是 "I solved the issue we had because of the circular dependency between X and Y"。
如果您搜索如何解决循环依赖,答案几乎总是 "use interfaces"。我知道这种技术如何用于使循环依赖起作用,但我不明白这是如何解决循环依赖的。
假设我有 2 个 类 View 和 Presenter,它们相互引用。现在我应用 "solution" 并创建接口 IView 和 IPresenter。 View不再引用Presenter,而是IPresenter; Presenter 引用 IView 而不是 View。
- 我设置了 View,它需要一个 IPresenter。
- 要实现 IPresenter,我需要设置 Presenter。
- 要设置 Presenter,我需要一个 IView。
- 要实现 IView,我需要设置视图。
圈子变大了,但还在。 View 和 Presenter 仍然相互依赖,只是不直接。但是,我看到的每个答案都绝对确定循环依赖现在 已解决 。我这里有什么误会?
可以使用 DI 解决循环依赖,但只能使用 "delayed" 或 "property" 注入,而不是 "constructor" 注入。您需要先构建对象,然后在它们上设置属性以注入依赖项。支持 属性 注入的 DI 容器可以抽象掉这些细节。
这些循环依赖没有被解决。
这些情况的标准答案是在构建之后分配依赖。这解决了这些循环依赖性产生的问题,但没有解决循环依赖性本身。
这可能主要是语言问题,人们只说 "I solved the circular dependency between X and Y" 而不是 "I solved the issue we had because of the circular dependency between X and Y"。