Domain層到底是什么

層級主要職責是否依賴 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)后在本地生成的可寫副本。特…