源代碼地址https://github.com/junkai-li/NetCoreKevin
基于NET6搭建跨平臺(tái)WebApi架構(gòu)支持單點(diǎn)登錄、多緩存、自動(dòng)任務(wù)、分布式、多租戶、日志、授權(quán)和鑒權(quán) 、網(wǎng)關(guān) 注冊與發(fā)現(xiàn)、CAP集成事件、領(lǐng)域事件、 docker部署
首要要理解什么是領(lǐng)域事件?
領(lǐng)域事件是指發(fā)生在特定領(lǐng)域中的事件,是你希望在同一個(gè)領(lǐng)域中其他部分知道并產(chǎn)生后續(xù)動(dòng)作的事件
領(lǐng)域事件是領(lǐng)域?qū)<宜P(guān)心的(需要跟蹤的、希望被通知的、會(huì)引起其他模型對象改變狀態(tài)的)發(fā)生在領(lǐng)域中的一些事情
領(lǐng)域事件的作用是捕獲領(lǐng)域中發(fā)生的具有業(yè)務(wù)價(jià)值的一些事情,保證聚合間的數(shù)據(jù)一致性,替換批量處理,實(shí)現(xiàn)事件源模式,進(jìn)行限界上下文集成等1。領(lǐng)域事件是一個(gè)領(lǐng)域模型中極其重要的部分,用來表示領(lǐng)域中發(fā)生的事件。一個(gè)領(lǐng)域事件必須對業(yè)務(wù)有價(jià)值,有助于形成完整的業(yè)務(wù)閉環(huán),也即一個(gè)領(lǐng)域事件將導(dǎo)致進(jìn)一步的業(yè)務(wù)操作。 領(lǐng)域事件可以是業(yè)務(wù)流程的一個(gè)步驟,例如訂單提交,客戶付費(fèi)100元,訂單完工后續(xù)業(yè)務(wù)
1.在同一微服務(wù)中使用領(lǐng)域事件
不同微服務(wù)中使用集成事件本架構(gòu)也有實(shí)現(xiàn)參考CAP
在微服務(wù)架構(gòu)中,集成事件和領(lǐng)域事件都是用于保持領(lǐng)域狀態(tài)同步的方式。集成事件用于跨多個(gè)微服務(wù)或外部系統(tǒng)保持域狀態(tài)同步,而領(lǐng)域事件為聚合間提供了最終一致性。集成事件的目的是將已提交事務(wù)和更新傳播到其他子系統(tǒng),無論它們是其他微服務(wù)、綁定上下文,還是外部應(yīng)用程序。因此,它們應(yīng)僅在成功保存實(shí)體時(shí)發(fā)生,否則便會(huì)如同整個(gè)操作從未發(fā)生一樣。而領(lǐng)域事件可以將大的批量操作簡化為許多小的業(yè)務(wù)操作,完成強(qiáng)大的事件存儲(chǔ),完成限界上下文間的集成,是更復(fù)雜架構(gòu)(cqrs)的一種支持12。
在保證集成事件和領(lǐng)域事件的最終一致性方面,可以使用消息隊(duì)列等異步通信方式。如果系統(tǒng)使用受集成事件驅(qū)動(dòng)的最終一致性,建議讓最終用戶清楚這種方法。系統(tǒng)不應(yīng)使用模擬集成事件的方法,例如 SignalR 或客戶端輪詢系統(tǒng)。最終用戶和業(yè)務(wù)所有者必須顯式接受系統(tǒng)中的最終一致性,并意識(shí)到在許多情況下,只要顯式使用該方法,業(yè)務(wù)就可以得到很好的支持3.
**
集成事件 (Integration Event)用于使領(lǐng)域狀態(tài)在多個(gè)微服務(wù)或外部系統(tǒng)中保持同步,將已提交事務(wù)和更新傳播到其他子系統(tǒng),無論它們是其他微服務(wù)、綁定上下文,還是外部應(yīng)用程序。而領(lǐng)域事件 (DomainEvent)是推送到領(lǐng)域事件調(diào)度程序的消息,可基于IoC容器或任何其他方法作為內(nèi)存中轉(zhuǎn)存進(jìn)程實(shí)現(xiàn) (如 Mediator),用于驅(qū)動(dòng)業(yè)務(wù)流轉(zhuǎn),盡量采用基于事件的最終一致,降低微服務(wù)之間直接訪問的壓力,實(shí)現(xiàn)微服務(wù)之間的解耦,維護(hù)領(lǐng)域模型的獨(dú)立性和數(shù)據(jù)一致性
**
**
基于mediatr實(shí)現(xiàn)領(lǐng)域事件并結(jié)合EFCore進(jìn)行二次封裝
**
參考架構(gòu)代碼

基于mediatr二次封裝類庫

服務(wù)注入

繼承領(lǐng)域事件繼承類

注冊事件 處理事件

添加事件

處理

EFcore dbContext Publish 事件

測試