我看到了在视图控制器(注入)之间传递依赖关系而不是使用全局状态的好处。然而,我很好奇人们如何在实践中实现这一点。
在最简单的情况下,很容易在两个视图控制器之间传递一个模型:
MyViewController *vc = [[MyViewController alloc] init];
vc.model = model;
[self.navigationController pushViewController:vc animated:YES];
但是,我发现扩展这种方法存在两个问题:
1)您可能有一些所有视图控制器都需要的服务(位置管理器、对象存储等)。因此,您最终会得到一个必须记住为每个视图控制器设置的依赖项列表:
MyViewController *vc = [[MyViewController alloc] init];
vc.model = model;
vc.locationManager = locationManager;
vc.objectStore = objectStore;
...
[self.navigationController pushViewController:vc animated:YES];
2)第二个问题与第一个问题有关:您实际上并没有强制在推送视图控制器之前设置这些依赖项。我想您可以编写一个需要所有依赖项的 init 方法,但您仍然无法强制执行它。它也将是冗长的,如果您想稍后添加依赖项,那将是一个巨大的痛苦。
处理这些问题的方法是什么?似乎没有多少 Obj-C 人使用依赖注入框架。我能想到的一种方法是创建一个包含所有共享依赖项的 AppContext 类,然后将其传递给所有视图控制器。
此外,通常您使用接口而不是实现来声明依赖项(至少在 Java 中),因此您可以模拟它们以进行单元测试。我没有看到很多 Obj-C 人以这种方式使用协议。然后你如何模拟单元测试的依赖关系?