考虑到VIPER结构
我有两个模块,A 和 B。第一个模块 A,通过演示者,想要执行一个必须在模块 B 中完成的 Action ,所以告诉它的线框去做。问题是,谁负责实例化整个模块( View 、交互器、演示器……)。我看到了一些采用不同方法的示例:
- 在应用程序的开头创建所有模块。
- 在模块的线框中创建整个模块,因此在这种情况下,BWireframe 的类方法实例化所有 B 模块。
考虑到线框负责路由,是否也负责创建其模块?
最佳答案
TL;DR:我建议您使用像 Typhoon 这样的 DI 框架并让它处理实例化。
您可能不希望您的线框实例化 VIPER 模块(View、Presenter、Interactor、DataManager)中的所有内容的原因是您将直接为这些组件中的每一个创建依赖项。
依赖性使软件难以改变:如果我们用我们的 onion architecture 来思考它/hexagonal architecture戴上帽子,通过不仅了解 View ,还了解数据管理器,线框将跨越至少两个独立的洋葱层的边界。
这迫使我们将线框图视为通用基础设施类:即,位于您应用程序最外层的东西。
但是,这与线框的其他(也是更真实的)职责相矛盾:进行导航。虽然这仍然是基础设施层,但它属于 UIKit
(-presentViewController:
等)。
所以恕我直言,VIPER 的线框做得太多了。
唯一明智的做法是拆分这两个职责:
- VIPER 类的初始化:你可以引入一个 factory , 或者使用专为解决这个问题而设计的 DI 工具
- 进行导航:这属于
线框
的范围。
附加说明
如果您想知道“谁实例化了下一个模块?”,那么,恕我直言,我认为某些模块 A
的线框与模块 B
的线框尽管 VIPER post 是什么说。
原因是 Module A
现在将依赖于 Module B
,导致紧密耦合:这违背了模块的目的。更多关于这个话题的讨论在 VIPER-TODO project at GitHub =]
希望这对您有所帮助。
关于iOS VIPER 架构,谁来实例化一个完整的模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27442094/