iOS VIPER架构,谁必须实例化整个模块?

eme*_*gro 9 architecture ios

考虑到VIPER结构

在此输入图像描述

我有两个模块,A和B.第一个模块A,通过演示者,想要执行必须在模块B中完成的动作,因此告诉它的线框执行它.问题是,谁负责实例化整个模块(视图,交互者,演示者......).我看到了一些不同方法的例子:

  • 在应用程序的开头创建所有模块.
  • 在模块的线框中创建整个模块,因此在这种情况下,BWireframe的类方法即时通过所有B模块.

考虑到线框负责路由,它是否还负责创建其模块?

fat*_*oku 15

TL; DR:我建议你应该使用像Typhoon这样的DI框架并让它处理实例化.

您可能不希望您的线框实例化VIPER模块(View,Presenter,Interactor,DataManager)中的所有内容的原因是您将直接为每个组件创建依赖关系.

依赖性使得软件能够抵抗变化:如果我们用洋葱架构/六边形架构帽子来思考它,线框架将通过不仅知道视图而且知道数据管理器来跨越洋葱的至少两个单独层的边界.

这迫使我们将线框视为通用基础结构类:即,应用程序最外层的某些内容.

然而,这与线框的其他(以及更真实的)责任相矛盾:做导航.虽然这仍然是基础设施层,但它完全属于UIKit(-presentViewController:等).

所以恕我直言,VIPER的线框做得太多了.

唯一明智的做法是分担两个责任:

  1. VIPER类的初始化:您可以引入工厂,或使用旨在解决此问题的DI工具
  2. 做导航:这仍然在a的范围内Wireframe.

补充说明

如果你想知道" 实例化下一个模块?",那么恕我直言,我认为,尽管VIPER帖子说的是,有些Module A线框与线框对话是不对的.Module B

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

希望这可以帮助.