全文共7044字,预计学习时长14分钟
图片来源:unsplash.com/@max_duz
Swift 5.1增加了许多新功能,其中一些功能有望彻底改变编写和构建Swift代码的方式。那么,如何使用Swift 5.1 Property Wrappers(属性包装器)将依赖注入代码减少一半?
本文讨论了Swift Property Wrappers,并演示一种可大大简化代码的方法。
背景
现代软件开发是一种有关项目管理复杂性的练习,架构是我们试图实现这一练习的方法之一。 反过来,架构实际上只是一个术语,用于描述如何将复杂的软件分解为易于了解的层和组件。
因此,我们将软件分解为可以轻松编写的简化组件,只做一件事(单一职责原则,SRP),并且可以轻松测试。
然而,一旦拥有了一堆部件,就必须将所有部件重新连接在一起,才能形成一个工作应用程序。
以正确的方式将部件连接在一起,就能得到一个由松散耦合的组件组成的整洁架构。
但如果连接的方式出错了,最终只能得到一个紧密耦合的乱码,其中的大多数部件都包含许多子组件构建和在内部运作的方法的信息。
这使组件共享几乎不可能实现,并且同样无法轻松地将一个组件层换成另一个组件层。
这样的情况令人左右为难,在尝试简化代码时使用的工具和技术最终却使我们的生活变得更加复杂。
幸运的是,可以使用另一种技术来管理这个额外的复杂层,该技术被称为依赖注入,基于一个称为控制反转的原理。
依赖注入
本文无法对依赖注入作出完整且详尽的解释,简单来说,即依赖注入允许给定组件向系统要求连接到完成其工作所需的所有部件。
这些依赖项将返回到完全成型并准备使用的组件。
例如,ViewController(视图控制器)可能需要ViewModel(视图模型)。 ViewModel可能需要一个API组件来获取一些数据,这些数据又需要访问身份验证系统和当前的会话管理器。ViewModel还需要一个具有依赖关系的数据转换服务。
ViewController不涉及这些东西,也不应该涉及,只需与它完成工作所需的组件进行对话。
为了演示所涉及的技术,本文将使用一个称为Resolver的强大的轻量型依赖注入系统。如果你使用其它任何DI框架也可。
如果想了解更多信息,请参阅Resolver GitHub存储库上的Dependency Injection指南,以及Resolver本身的相关文档。
传送门:https://github.com/hmlongco/Resolver/blob/master/Documentation/Introduction.md?source=post_page---------------------------