层级主要职责是否依赖 iOS / UIKit?
Presentation (UI)视图、控制器、ViewModel,将用户操作转成「意图」,把结果渲染到屏幕
Domain业务规则用例 (Use Case),维护系统在概念上的真实世界模型(纯 Swift,完全无框架依赖)
Data / Infrastructure网络、数据库、文件、Keychain、BLE…任何“把数据拿进来/写出去”的具体实现

一句话:Domain 层 = 纯业务核心,既不关心 UI,也不关心数据从哪里来,只关注「业务要做成什么样」。


为什么以前几乎感受不到它?
  • MVC / MVVM 在小型项目里把业务代码直接写进 Controller/ViewModel,Domain 与 UI 混在一起时就很难察觉它的存在。
  • 项目规模一旦变大,UI 逻辑(动画、路由)与业务规则(计费、权限)纠缠,就会让测试、复用、多人协作变痛苦;这时才需要显式抽出 Domain。

Domain 层包含什么?
组件说明Swift 示例
Entity / Value Object业务对象及其不变式swift struct Order { let id: UUID let items: [OrderItem] func total() -> Decimal { … } }
Use Case / Interactor对应〝用户故事〞的业务流程;组合多实体完成一次操作swift protocol PlaceOrderUseCase { func execute(request: PlaceOrderRequest) throws -> Order }
Repository 接口Domain 面向的数据抽象,用协议表达,无实现细节swift protocol OrderRepository { func save(_ order: Order) throws func by(id: UUID) -> Order? }
Domain Service(可选)涉及多个实体但不属于任何一个实体的方法PaymentService, DiscountCalculator

关键词:纯 Swift + 不依赖三方库 —— 这样才能在单元测试里无需启动 App、无需网络就验证业务规则。


与 iOS 常见架构的对应关系
架构Domain 所在位置
VIPER“Interactor” 就是 Domain 用例;“Entity”=Domain 实体
Clean Swift / VIP“Interactor” + “Entity”
Clean Architecture内层「Domain」圆环
MVVM-C额外抽出一个 UseCase / Service 层即可形成 Domain

简单示例:聊天未读数

需求:展示未读消息数量,并在后台推送来时更新

User UI(ViewModel) UI Domain(UseCase) Domain Repository Infrastructure(API) Infrastructure 打开对话列表 getUnreadCount() fetchUnreadCount() GET /unread-count 3 3 3 未读: 3 User UI(ViewModel) UI Domain(UseCase) Domain Repository Infrastructure(API) Infrastructure
  • EntityConversation, UnreadCounter
  • UseCaseGetUnreadCountUseCase
  • Repository 协议UnreadRepository
  • Infrastructure 实现UnreadApiDataSource, UnreadCoreDataDataSource
  • UIBloc/CubitViewModel,只调用 GetUnreadCountUseCase

现在改用本地 Realm 缓存?只换 Infrastructure 层实现,Domain 与 UI 毫无改动。


如何在现有 iOS 项目引入 Domain 层?
  1. 收集业务规则

    • 订单金额计算、优惠叠加、登录态判断等经常被多处调用、变化概率低的逻辑。
  2. 抽出纯 Swift 类型

    • UIKit, FoundationNetworking, CoreData 依赖砍掉,只留下值类型 / 协议。
  3. 定义用例协议

    • PlaceOrder, SendMessage, MarkAsRead… UI 通过协议调用,用 DI (如 Swinject) 注入。
  4. 重构 UI

    • Controller 里不再处理业务计算,仅收集输入,调用 UseCase,拿结果渲染。
  5. 编写单元测试

    • 用内存 FakeRepository 替换实际网络/数据库,快速验证边界条件。

小结

  • Domain 层 = 你 App 的“核心大脑”
  • 独立于任何框架,因此可移植、可测试、可长期演进。
  • 把 Domain 抽清楚后,UI 和数据层都变成可替换的「插件」,让大型 iOS 项目依旧保持灵活与可维护。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/86081.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/86081.shtml
英文地址,请注明出处:http://en.pswp.cn/web/86081.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rust 服务端项目分层结构

DDD src/ ├── main.rs # 程序入口,负责启动和依赖注入 ├── lib.rs # 公共库入口,便于单元测试和复用 ├── config.rs # 配置管理(如数据库、端口、环境变量等) ├── entities/ …

山东大学《Web数据管理》期末复习宝典【万字解析!】

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏:🏀山东大学期末速通专用_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1…

解决“在EFI系统上,Windows只能安装到GPT磁盘“错误

环境:AMI BIOS(2012 American Megatrends,Inc.),清华同方笔记本,windows10安装U盘 背景:使用安装U盘安装系统时,在选择磁盘下一步,出现了“无法在驱动器0的分区1上安装windows(w)。…

NetworkTermination-原始固件-分区备份

在对设备进行固件分区备份之前,我们需要通过设备的 debug 接口进行连接。设备的 debug 接口位于左下角,连接时需设置波特率为 115200。 ssh连接 设备默认的 SSH 服务配置较为严格,端口号为 33998,且不允许通过密码直接登录。我们可…

Network Manager客户端制作小结

关联资料 Unity 入门到精通(沈军) c语言中的局部变量和全局变量_c语言全局变量-CSDN博客 关键词 本地玩家信息:LocalClientId 网络状态及网络序列化 网络游戏服务器和客户端 ClientRpc与ServerRpc 变量作用域与作用周期 Network Manager —…

Python 开发环境全栈隔离架构:从 Anaconda 到 PyCharm 的四级防护体系

【深度探索】Windows 下 Python 多版本虚拟环境管理与隔离实战:支持 Anaconda、Poetry、Pipenv、venv、uv、Hatch、PyCharm、VS Code 全工具链方案-CSDN博客 【零基础】Python 多版本虚拟环境管理与隔离实战——支持 Anaconda、Poetry、Pipenv、venv、uv、Hatch、Py…

Redis集群性能优化实战指南

Redis集群性能优化实战指南 一、技术背景与应用场景 随着互联网服务规模不断扩大,缓存层承载了海量的读写请求。Redis因其高性能和丰富的数据结构被广泛用于缓存、排行榜、会话存储等场景。单节点Redis在并发、内存和持久化方面会遇到瓶颈,Redis集群&a…

使用 Telegraf 向 TDengine 写入数据

Telegraf 是一款十分流行的指标采集开源软件。在数据采集和平台监控系统中,Telegraf 可以采集多种组件的运行信息,而不需要自己手写脚本定时采集,降低数据获取的难度。 只需要将 Telegraf 的输出配置增加指向 taosAdapter 对应的 url 并修改…

华为云 Flexus+DeepSeek 征文|华为云Dify 平台 CCE 高可用集群部署与大模型高质量知识库构建指南

华为云 FlexusDeepSeek 征文|华为云Dify 平台 CCE 高可用集群部署与大模型高质量知识库构建指南 文章目录 华为云 FlexusDeepSeek 征文|华为云Dify 平台 CCE 高可用集群部署与大模型高质量知识库构建指南前言1、ModelArts Studio大模型开通2、Dify平台CC…

测试校招/应届刷题知识路线

需要重点关注计算机基础知识和测试相关技能 对于即将参加校招或应届的同学,测试岗位需要重点关注计算机基础知识和测试相关技能。 掌握操作系统、计算机网络、数据库等计算机基础,同时熟悉测试基础理论、测试方法、自动化测试工具 (如 Selenium、JMeter)和编程语言(如 Py…

华为云Flexus+DeepSeek征文 | 基于华为云的 Dify-LLM 企业级 AI 开发平台部署指南

前言 在人工智能技术迅猛发展的今天,大语言模型(LLM)已成为推动企业智能化转型的核心引擎。然而,如何高效、安全地将 LLM 能力整合到实际业务场景中,仍然是许多开发者面临的挑战。Dify 作为一款开源的 LLM 应用开发平…

Dify×奇墨科技:开源+本土化,破解企业AI落地难题

在人工智能技术迅猛发展的今天,企业亟需高效、安全的AI应用开发工具。开源LLMOps平台Dify.AI凭借其灵活性与开放性,已成为开发者构建AI应用的首选之一。而它在中国市场的规模化落地,离不开本土合作伙伴的强力支撑——奇墨科技作为Dify中国大陆…

Vue3+Spring boot 前后端防抖增强方案

我将基于您提供的防抖切面代码进行改进,主要优化点包括使用Redis实现分布式防抖、增强键生成策略、改进异常处理等。以下是完整的改进方案: 1. 改进的防抖注解 (Debounce.java) java 复制 下载 package com.weiyu.anno;import java.lang.annotation…

Cppcheck 使用教程:本地 + CMake + GitHub Actions 自动分析实战

Cppcheck 是一款强大的 C/C 静态分析工具,专注于发现内存泄漏、未初始化变量、死代码、未使用函数等问题。它不依赖编译器,适合在持续集成和本地开发中快速定位潜在 Bug。 本文将手把手教你如何: 安装 Cppcheck 在命令行中使用 集成到 CMak…

Mac Parallels Desktop Kali 2025 代理设置

Mac Parallels Desktop Kali 2025 代理设置 核心步骤: kali设置桥接wifi 查看kali和主机ip 运行命令ifconfig查看kali ip: mac主机ip: kali设置proxy ip填写主机ip,port为主机proxy端口 enjoy

通义灵码编程智能体深度评测(Qwen3模型+终端操作+MCP工具调用实战)

1 引言 随着AI编程助手进入工具链集成时代,通义灵码作为阿里云推出的智能编程解决方案,其Qwen3模型与MCP(Multi-tool Calling Platform)的协同能力引发开发者关注。本文将基于真实开发场景,从代码理解、终端操作和工具链调用三个维度展开深度…

SpringBoot电脑商城项目--商品详情+加入购物车

商品详情 1. 持久层 1.1. 规划sql语句 根据id查询商品详情 1.2 mapper层编写抽象方法 /*** 根据商品id查询商品详情* param id 商品id* return 匹配的id商品详情,如果没有匹配的数据,则返回null*/Product findById(Integer id); 1.3 xml文件中编写sq…

上交卡尔动力联合提出FastDrive!结构化标签实现自动驾驶端到端大模型更快更强

最近将类人的推理能力融入到端到端自动驾驶系统中已经成为了一个前沿的研究领域。其中,基于视觉语言模型的方法已经吸引了来自工业界和学术界的广泛关注。 现有的VLM训练范式严重依赖带有自由格式的文本标注数据集,如图1(a)所示。虽然这些描述能够捕捉丰…

C# 委托(什么是委托)

什么是委托 可以认为委托是持有一个或多个方法的对象。当然,一般情况下你不会想要“执行”一个对 象,但委托与典型的对象不同。可以执行委托,这时委托会执行它所“持有"的方法。 本章将揭示创建和使用委托的语法和语义。在本章后面&am…

iTwin briefcase, checkpoint ,standalone

在 iTwin.js 中,briefcase 和 checkpoint 都是 IModel 的不同连接类型,但它们的用途和特性不同: Briefcase 用途:用于本地编辑和同步。通常是用户从 iModelHub 检出(Check-out)后在本地生成的可写副本。特…