iOS VIPER 架构,谁来实例化一个完整的模块?

标签 ios architecture

考虑到VIPER结构

enter image description here

我有两个模块,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 的线框做得太多了。

唯一明智的做法是拆分这两个职责:

  1. VIPER 类的初始化:你可以引入一个 factory , 或者使用专为解决这个问题而设计的 DI 工具
  2. 进行导航:这属于线框的范围。

附加说明

如果您想知道“实例化了下一个模块?”,那么,恕我直言,我认为某些模块 A 的线框与模块 B 的线框尽管 VIPER post 是什么说。

原因是 Module A 现在将依赖于 Module B,导致紧密耦合:这违背了模块的目的。更多关于这个话题的讨论在 VIPER-TODO project at GitHub =]

希望这对您有所帮助。

关于iOS VIPER 架构,谁来实例化一个完整的模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27442094/

相关文章:

interface - 六边形体系结构和交易概念

architecture - Multi-Tenancy 或多实例?

java - 使用委托(delegate)来分隔层

ios - 无限调用 viewWillLayoutSubviews 导致屏幕卡住和内存警告

java - 如何让组件在添加到类路径时注册自己

派生类的 typescript 方法装饰器

ios - 如何从A中减去UIBezierPath A&B的交集?

ios - 在自定义 UICollectionView 类中实现时未正确调用数据源方法

ios - SwiftUI 自定义 PickerStyle

iphone - 在uitextview中显示微笑