日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DDD理论学习系列(8)-- 应用服务amp;amp;领域服务

發(fā)布時間:2023/12/4 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DDD理论学习系列(8)-- 应用服务amp;amp;领域服务 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. 引言

單從字面理解,不管是領(lǐng)域服務還是應用服務,都是服務。而什么是服務?從SOA到微服務,它們所描述的服務都是一個寬泛的概念,我們可以理解為服務是行為的抽象。從前綴來看,根據(jù)DDD的經(jīng)典分層架構(gòu),它們又隸屬于不同的層,應用服務屬于應用層,領(lǐng)域服務屬于領(lǐng)域?qū)印?/p>

  • 應用層(Application):負責展現(xiàn)層與領(lǐng)域?qū)又g的協(xié)調(diào),協(xié)調(diào)業(yè)務對象來執(zhí)行特定的應用程序任務。它不包含業(yè)務邏輯。

  • 領(lǐng)域?qū)?#xff08;Domain):負責表達業(yè)務概念,業(yè)務狀態(tài)信息以及業(yè)務規(guī)則,是業(yè)務軟件的核心。

所以綜合來看應用服務是用來表述應用行為,而領(lǐng)域服務用來表述領(lǐng)域行為。
那怎么理解應用行為和領(lǐng)域行為呢,應用行為描述了一個具體操作從開始到結(jié)束的每一個環(huán)節(jié),而領(lǐng)域行為是對應用行為的細化,用來處理具體的某一個環(huán)節(jié)。比如,我們手機購物,從購物車結(jié)算這一場景來舉例,這就是一個應用行為。而這個應用行為又主要包括金額計算、支付、生成訂單,這些子環(huán)節(jié)就可以理解為一個領(lǐng)域行為。

我們就不咬文嚼字了,下面我們就一一展開。

2. 應用服務

應用服務是用來表達用例和用戶故事(User Story)的主要手段。

應用層通過應用服務接口來暴露系統(tǒng)的全部功能。在應用服務的實現(xiàn)中,它負責編排和轉(zhuǎn)發(fā),它將要實現(xiàn)的功能委托給一個或多個領(lǐng)域?qū)ο髞韺崿F(xiàn),它本身只負責處理業(yè)務用例的執(zhí)行順序以及結(jié)果的拼裝。通過這樣一種方式,它隱藏了領(lǐng)域?qū)拥膹碗s性及其內(nèi)部實現(xiàn)機制。

應用層相對來說是較“薄”的一層,除了定義應用服務之外,在該層我們可以進行安全認證,權(quán)限校驗,持久化事務控制,或者向其他系統(tǒng)發(fā)生基于事件的消息通知,另外還可以用于創(chuàng)建郵件以發(fā)送給客戶等。

應用層作為展現(xiàn)層與領(lǐng)域?qū)拥臉蛄骸U宫F(xiàn)層使用VO(視圖模型)進行界面展示,與應用層通過DTO(數(shù)據(jù)傳輸對象)進行數(shù)據(jù)交互,從而達到展現(xiàn)層與DO(領(lǐng)域?qū)ο?#xff09;解耦的目的。

3.領(lǐng)域服務

領(lǐng)域?qū)泳褪禽^“胖”的一層,因為它實現(xiàn)了全部業(yè)務邏輯并且通過各種校驗手段保證業(yè)務正確性。而什么是業(yè)務邏輯呢?業(yè)務流程、業(yè)務策略、業(yè)務規(guī)則、完整性約束等。

當領(lǐng)域中的某個操作過程或轉(zhuǎn)換過程不是實體或值對象的職責時,我們便應該將該操作放在一個單獨的接口中,即領(lǐng)域服務。請確保該服務和通用語言時一致的;并且保證它是無狀態(tài)的。

根據(jù)這句話我們有幾個問題需要理清:

  • 什么時候使用領(lǐng)域服務?

  • 領(lǐng)域服務無狀態(tài)怎么理解?

  • 領(lǐng)域服務是用來協(xié)調(diào)領(lǐng)域?qū)ο笸瓿赡硞€操作,用來處理業(yè)務邏輯的,它本身是一個行為,所以是無狀態(tài)的。狀態(tài)由領(lǐng)域?qū)ο?#xff08;具有狀態(tài)和行為)保存。

    上面也說了,領(lǐng)域?qū)ο笫蔷哂袪顟B(tài)和行為的。那就是說我們也可以在實體或值對象來處理業(yè)務邏輯。那我們該如何取舍呢?
    一般來說,在下面的幾種情況下,我們可以使用領(lǐng)域服務:

    • 執(zhí)行一個顯著的業(yè)務操作過程

    • 對領(lǐng)域?qū)ο筮M行轉(zhuǎn)換

    • 以多個領(lǐng)域?qū)ο鬄檩斎?#xff0c;返回一個值對象。

    4. 案例分析

    我們拿經(jīng)典的轉(zhuǎn)賬問題來分析一下:
    而針對轉(zhuǎn)賬這一操作,它的業(yè)務用例應該是這樣的:

  • 檢查賬號余額是否足夠

  • 檢查目標賬戶賬號是否合法

  • 轉(zhuǎn)賬

  • 短信通知轉(zhuǎn)賬雙方

  • 其中1,2步是轉(zhuǎn)賬的合法性校驗屬于轉(zhuǎn)賬業(yè)務的一部分,所以,1,2,3均應該放到領(lǐng)域?qū)油ㄟ^領(lǐng)域服務來實現(xiàn)。短信通知,它并不是是轉(zhuǎn)賬的核心業(yè)務,因為這根據(jù)具體情況而定,比如只有客戶訂閱了賬號變動通知我才發(fā)短信。所以將第4步歸類到應用服務中去實現(xiàn),就確保了領(lǐng)域服務的純粹性。

    而至于持久化的問題,我們可以這樣想,領(lǐng)域邏輯應該只關(guān)心業(yè)務邏輯,才能保證領(lǐng)域邏輯的可重用性。將持久化放到應用層,我們就會有更多的選擇性。

    5.總結(jié)

    當應用服務中的邏輯趨于復雜時,我們就要小心領(lǐng)域邏輯泄露到應用服務中去。而在使用領(lǐng)域服務時,我們又要避免過度使用,因為會導致貧血領(lǐng)域模型。畢竟有些單一的操作更適合放到領(lǐng)域?qū)ο?#xff08;實體和值對象)中去。

    所以總結(jié)以下:

  • 服務是行為的抽象。

  • 應用服務通過委托領(lǐng)域?qū)ο蠛皖I(lǐng)域服務來表達用例和用戶故事。

  • 領(lǐng)域?qū)ο?#xff08;實體和值對象)負責單一操作。

  • 領(lǐng)域服務用于協(xié)調(diào)多個領(lǐng)域?qū)ο蠊餐瓿赡硞€業(yè)務操作。

  • 應用服務不處理業(yè)務邏輯,領(lǐng)域服務處理業(yè)務邏輯。


  • 相關(guān)文章

    • DDD理論學習系列(1)-- 通用語言

    • DDD領(lǐng)域驅(qū)動之干貨 (一)

    • DDD理論學習系列(2)-- 領(lǐng)域

    • DDD理論學習系列(3)-- 限界上下文

    • DDD理論學習系列(4)-- 領(lǐng)域模型

    • 事件總線知多少(2)

    • DDD理論學習系列(5)-- 統(tǒng)一建模語言

    • DDD理論學習系列(6)-- 實體

    • DDD理論學習系列(7)-- 值對象

    • 從事件和DDD入手來構(gòu)建微服務

    • DDD領(lǐng)域驅(qū)動之干貨 (一)

    • WeText項目:一個基于.NET實現(xiàn)的DDD、CQRS與微服務架構(gòu)的演示案例

    • 【DDD/CQRS/微服務架構(gòu)案例】在Ubuntu 14.04.4 LTS中運行WeText項目的服務端

    原文地址:http://www.cnblogs.com/sheng-jie/p/7097129.html


    .NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關(guān)注

    總結(jié)

    以上是生活随笔為你收集整理的DDD理论学习系列(8)-- 应用服务amp;amp;领域服务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。