LESSON 25 / 575 分钟

轻量架构、依赖注入与测试替身

为小应用保留清晰边界,就足以让你和 AI 安全地迭代。

用你的前端经验理解

View ≈ UI 组件;Model/状态模型 ≈ store;Service ≈ API 层。MVVM 是一种组织方式,不是 SwiftUI 必须采用的标准。

为什么需要它

对小型应用,架构的目标是让变化有位置、错误可定位、逻辑能测试。你不需要先实现一套抽象框架。可以从 View、功能状态模型和仓库三个职责开始:View 呈现状态,模型组织动作,仓库处理网络或磁盘。只有当重复和依赖边界确实出现时再继续拆分。

它是怎样工作的

依赖注入就是从外部提供所需能力,最简单形式是初始化器参数。把具体 URLSession 请求藏在仓库后面,可以在测试中换成固定数据;但协议应围绕调用方的实际需求设计。状态更新由明确所有者负责,避免 View、单例和仓库各自保存不同版本的同一数组。

把关键概念连起来

1

边界

View 负责展示和交互意图;业务规则放模型或服务;网络与存储通过明确接口访问。

2

依赖

从初始化参数或环境注入服务,避免随处创建单例。测试时替换成可控制的 mock。

3

尺度

简单页面可直接使用 SwiftUI 状态。出现重复逻辑、多来源数据或复杂状态流时再抽离模型。旧项目也可能使用 Combine 的 Publisher、订阅与取消来组织事件流;它不等同于 Observation。

为“添加文章”建立最小边界

  1. View 收集标题与网址,调用功能模型的 add 动作;模型验证输入并切换提交状态。
  2. 仓库返回保存结果或错误。成功后模型更新可见数据,失败时保留草稿,View 只根据状态决定提示。
  3. 测试注入失败仓库,无需真实断网即可验证“错误后草稿仍在、按钮恢复可用”。

这里需要你亲自判断

不要让 AI 一次生成十层架构。先做到一条垂直业务流程可运行、可解释、可测试。

做一个小练习

将“加载阅读清单”抽成一个依赖,并在预览里注入固定数据与失败结果。

  1. 画出 View→模型→仓库的依赖方向,标出哪些对象允许调用系统 API。
  2. 实现一个固定失败的测试替身,验证页面动作不会误报成功。
展开参考思路与验收标准

可测试的核心是依赖边界,不是文件数量。不要让仓库反向引用 View,也不要为了一个只有一次使用的纯函数引入多层工厂和管理器。

依赖注入最直接带来什么?

继续查阅官方资料
Apple Developer 官方资料

本课聚焦核心认知。具体 API、系统要求与发布政策,以当前官方文档和工程验证为准。

答对理解题后即可标记完成