第二章 領域 子域 限界上下文
用戶和權限從核心域抽離,作為支撐域或者通用域
為模型每個階段各自的限界上下文,共享一個身份標識
REST資源即被稱為開放主機服務 Open Host Service
應用服務扮演的是一種門面模式,具有任務管理功能
一個團隊 一個限界上下文 一個項目
用戶權限應該獨立一個限界上下文 IdOvation
第三章 上下文映射圖
Customer-Supplier 客戶方-供應方
Conformist 遵奉者
應用服務和領域服務是不同的,領域邏輯不應該出現(xiàn)在應用中,應用服務可以用于控制持久化事務和安全認證,或者向其他系統(tǒng)發(fā)送基于事件的消息通知,還可以用于創(chuàng)建郵件發(fā)送給用戶,應用服務本身不處理業(yè)務邏輯,主要用于協(xié)調(diào)領域?qū)ο蟮牟僮?比如聚合,
應用服務通常用途是:接受來自用戶界面的輸入?yún)?shù),再通過資源庫獲取聚合實例,執(zhí)行相應命令
應用服務應該使用工廠或聚合的構(gòu)造函數(shù)來實例化對象,然后采用資源庫進行持久化,應用服務還可以調(diào)用領域服務來完成領域相關的操作,但此時的操作應該是無狀態(tài)的
應用層可以將領域事件的訂閱方注冊到任意數(shù)量的事件上,好處是可以對事件進行存儲和轉(zhuǎn)發(fā)
基礎設施層
持久化和消息機制,電子郵件 SMS都在這一層
依賴倒置
高層模塊不應該依賴于底層模塊, 兩者都應該依賴于抽象
抽象不應該依賴于細節(jié),細節(jié)應該依賴于抽象
REST和DDD
不建議將領域模型直接暴露給外界,原因是領域模型的每次改變都會導致對系統(tǒng)接口的該百年
CQRS
一個方法要么是執(zhí)行某種動作的命令,要么是返回數(shù)據(jù)的查詢,不能兩者皆是
如果一個方法修改了對象的狀態(tài),該方法便是一個命令,他不應該返回數(shù)據(jù),方法聲明為void
如果一個方法返回了數(shù)據(jù),該方法便是一個查詢,他不應該通過直接或間接的手段修改對象的狀態(tài)
命令模型 Command Model : 資源庫只有add() save()方法,同時只有一個查詢方法 fromId() 命令模型每個方法再執(zhí)行完都將發(fā)布領域事件(觀察者模式 設計模式),查詢模型根據(jù)領域事件進行更新
查詢模型 Query Model: 比如對屬性進行過濾,是一種非規(guī)范的模型,不反映領域行為
長時處理過程 Saga 按需重新看
事件源 Event Sourcing
跟蹤單個實體和聚合的變化,記錄所有操作的歷史記錄
事件源可以取代ORM 以二進制的方式保存在事件存儲中
第五章 實體
值對象可以存放實體唯一標識,值對象是不變的,這樣可以保證實體身份的穩(wěn)定性
應用程序生成唯一標識,如UUID/GUID/雪花算法等
對于聚合根的唯一標識,我們可以采用資源庫來生成唯一標識
委派標識 泛指主鍵id
領域標識不需要作為數(shù)據(jù)庫主鍵
角色和擔責 沒看懂
創(chuàng)建實體
使用及早生成唯一標識時,構(gòu)造函數(shù)至少需要接受一個唯一標識作為參數(shù),如果還有可能通過其他方式對實體進行查找,也需要一并傳給構(gòu)造函數(shù)
驗證整體對象
驗證邏輯比領域?qū)ο蟊旧碜兓€快,將驗證邏輯嵌入在領域?qū)ο笾幸彩沟妙I域?qū)ο蟪袚颂嗟穆氊?此時我們可以創(chuàng)建一個單獨的組件來完成模型驗證
驗證類可以實現(xiàn)規(guī)范模式或策略模式
第六章 值對象
不變性:值對象中不引用實體,因為實體瞬息萬變