溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》
  • 首頁 > 
  • 教程 > 
  • 開發(fā)技術(shù) > 
  • 編程語言 > 
  • .NET應(yīng)用架構(gòu)設(shè)計(jì)—面向查詢的領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)實(shí)踐(調(diào)整傳統(tǒng)三層架構(gòu),外加維護(hù)型的業(yè)務(wù)開關(guān))

.NET應(yīng)用架構(gòu)設(shè)計(jì)—面向查詢的領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)實(shí)踐(調(diào)整傳統(tǒng)三層架構(gòu),外加維護(hù)型的業(yè)務(wù)開關(guān))

發(fā)布時(shí)間:2020-04-09 21:51:05 來源:網(wǎng)絡(luò) 閱讀:1620 作者:王清培 欄目:編程語言

閱讀目錄:

  • 1.背景介紹

  • 2.在業(yè)務(wù)層中加入核心領(lǐng)域模型(引入DomainModel,讓邏輯、數(shù)據(jù)有家可歸,變成一個(gè)完整的業(yè)務(wù)對(duì)象)

  • 3.統(tǒng)一協(xié)調(diào)層Application Layer(加入?yún)f(xié)調(diào)層來轉(zhuǎn)換DomianModel)

  • 4.從數(shù)據(jù)扁平結(jié)構(gòu)轉(zhuǎn)換成OO體系結(jié)構(gòu)(使用OO豐富代碼結(jié)構(gòu))

  • 5.DomainModel中的內(nèi)容(帶開關(guān)的Specification、SOA化的Specification)

  • 6.模式、重構(gòu)、單元測(cè)試在領(lǐng)域模型中的運(yùn)用

1.背景介紹

由于時(shí)間關(guān)系廢話不多扯了,直奔主題,對(duì)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)不是太了解的朋友請(qǐng)先熟悉相關(guān)主題或參考本人以下兩篇文章:

.NET領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)—初嘗(疑問、模式、原則、工具、過程、框架、實(shí)踐),這篇文章對(duì)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的基本精神詳細(xì)分析;

.NET領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)—實(shí)踐(穿過迷霧走向光明),這篇文章對(duì)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的一個(gè)基本實(shí)踐,記錄下了實(shí)踐過程、建模的技巧等內(nèi)容;

DomainModel是由很多細(xì)粒度的Object組成,按照以往的教訓(xùn)(將Object行為、數(shù)據(jù)肢解,得到一個(gè)殘缺的Object),現(xiàn)在我們將邏輯行為和數(shù)據(jù)綁定在一起,形成了一個(gè)豐富的領(lǐng)域模型,這也是面向?qū)ο笤O(shè)計(jì)原則之一;想了解更多關(guān)于實(shí)現(xiàn)面向?qū)ο蟮募记烧?qǐng)參考【《實(shí)現(xiàn)模式》作者:Kent Beck】一書;

但是這樣又帶來了由于充血型DDD模型會(huì)給面向大規(guī)模查詢的業(yè)務(wù)模塊帶來一定的性能開銷,試想一個(gè)OrderManager對(duì)象,如果我們需要獲取在某個(gè)條件范圍類的所有Order會(huì)給OrderManager帶來很多性能、邏輯上的復(fù)雜度;根據(jù)DDD.CQRS架構(gòu),得知將DomainModel中的查詢邏輯單獨(dú)剝離出去,讓Command端很干凈的處理聚合的寫邏輯,在Query端也很直接的處理查詢邏輯;

這樣設(shè)計(jì)之后會(huì)有一個(gè)很尷尬的情況,在Query端的DomainModel不被關(guān)注了,因?yàn)镼uery的邏輯有簡(jiǎn)單有復(fù)雜,大型站點(diǎn)會(huì)有很多復(fù)雜的查詢邏輯還會(huì)有很多的業(yè)務(wù)開關(guān),做過維護(hù)的朋友應(yīng)該知道新功能上線需要有switch的控制,這是為了安全起見吧;但是簡(jiǎn)單的業(yè)務(wù)邏輯就會(huì)被我們下意識(shí)的認(rèn)為不需要使用完整的DomainModel結(jié)構(gòu),還是使用傳統(tǒng)的分層架構(gòu)上層依賴下層,Business Layer直接依賴DataAccess Layer,其實(shí)這個(gè)時(shí)候Business Object已經(jīng)不在是遵循“單一職責(zé)”原則了,這樣時(shí)間一長又慢慢的回到了以前肢解Object的困境;

這篇文章是講解如何在Query端實(shí)踐DDD,如何運(yùn)用DDD的強(qiáng)項(xiàng)來解決復(fù)雜業(yè)務(wù)邏輯的實(shí)現(xiàn),尤其是復(fù)雜的業(yè)務(wù)邏輯需要開關(guān)控制的時(shí)候其實(shí)更需要DomainModel來完成;

2.在業(yè)務(wù)層中加入核心領(lǐng)域模型(引入DomainModel,讓邏輯、數(shù)據(jù)有家可歸,變成一個(gè)完整的業(yè)務(wù)對(duì)象)

由于我們?nèi)狈︻I(lǐng)域模型,所以導(dǎo)致我們的業(yè)務(wù)邏輯、規(guī)則隨波逐流,無家可歸,時(shí)間久了就搞不清到底這塊業(yè)務(wù)邏輯是哪里的;我們現(xiàn)有的Domain Model是一個(gè)數(shù)據(jù)映射對(duì)象用來傳遞數(shù)據(jù)用的,嚴(yán)格意義是一個(gè)DTO對(duì)象,大部分的項(xiàng)目都將DTO命名為DomainModel但是其實(shí)里面沒有任何的行為、方法,只是一個(gè)純粹的數(shù)據(jù)傳輸用的容器,所以稱不上DomainModel;

所以我們首先要做的就是加入DomainModel,然后逐漸將邏輯搬移到DomainModel中來,在進(jìn)行逐步的重構(gòu)、單元測(cè)試,讓其成為一個(gè)可以測(cè)試的具有一定核心價(jià)值的可重用的DomainModel;

3.統(tǒng)一協(xié)調(diào)層Application Layer(加入?yún)f(xié)調(diào)層來轉(zhuǎn)換DomainModel)

我們的Service沒有Application Layer  也稱協(xié)調(diào)層,專門用來組裝業(yè)務(wù)處理環(huán)節(jié)的統(tǒng)一調(diào)度中心,它并非只是一個(gè)簡(jiǎn)單的靜態(tài)類;傳統(tǒng)三層中沒有應(yīng)用層的概念或者說應(yīng)用層的概念沒扭曲了,或者并沒有發(fā)揮其的核心作用;我們需要加入應(yīng)用層來協(xié)調(diào)DomainModel的工作;

4.從數(shù)據(jù)扁平結(jié)構(gòu)轉(zhuǎn)換成OO體系結(jié)構(gòu)(使用OO豐富代碼結(jié)構(gòu))

當(dāng)我們使用DTO對(duì)象成功將數(shù)據(jù)從數(shù)據(jù)源獲取之后,就需要一個(gè)對(duì)象化的過程,將扁平化的數(shù)據(jù)實(shí)體轉(zhuǎn)換成豐滿的領(lǐng)域模型,這個(gè)時(shí)候所有的領(lǐng)域規(guī)則將起作用;

5.DomainModel中的內(nèi)容(帶開關(guān)的Specification、SOA化的Specification)

1.實(shí)體:

簡(jiǎn)單理解為OO對(duì)象,可以獨(dú)立存在也可以聚合在某個(gè)領(lǐng)域?qū)嶓w下,如果聚合在某個(gè)實(shí)體下那么只能通過父級(jí)實(shí)體進(jìn)行一系列的訪問;

2.工廠:

對(duì)實(shí)體進(jìn)行有相關(guān)約定的創(chuàng)建,這其中包括各種驗(yàn)證、約束、開關(guān)等等前提條件。注意:創(chuàng)建實(shí)體不像創(chuàng)建數(shù)據(jù)DTO那么簡(jiǎn)單;

3.規(guī)約、規(guī)約工廠:

對(duì)業(yè)務(wù)規(guī)則進(jìn)行對(duì)象化,將原本淹沒在雜亂無章代碼中的核心業(yè)務(wù)規(guī)則提取出來統(tǒng)一管理;這可以很好的像規(guī)則配置化(專業(yè)稱:規(guī)則外掛);注意:這可以和我們的業(yè)務(wù)開關(guān)進(jìn)行合并;最值得驚喜的是可以通過規(guī)約工廠來實(shí)現(xiàn)面向SOA的規(guī)約;

4.領(lǐng)域事件(擴(kuò)展):

監(jiān)控、觀察等等非侵入式的獲取實(shí)體在業(yè)務(wù)處理當(dāng)中的狀態(tài)數(shù)據(jù),如:發(fā)送一封郵件、記錄一條LOG,但是這種代碼嚴(yán)禁寫入業(yè)務(wù)邏輯層包括分層架構(gòu)中的任何一個(gè)層面,它必須是在一個(gè)無關(guān)緊要的宿主中進(jìn)行,類似管道模型的Module;

5.面向特定業(yè)務(wù)開關(guān):

由于我們每次添加或修改業(yè)務(wù)邏輯都會(huì)加入相應(yīng)的開關(guān)控制,如果這個(gè)開關(guān)是和業(yè)務(wù)邏輯相關(guān)的那么就可以很巧妙的和規(guī)約合并設(shè)計(jì);

6.模式、重構(gòu)、單元測(cè)試在領(lǐng)域模型中的運(yùn)用

設(shè)計(jì)模式的運(yùn)用:通過運(yùn)用DDD就可以方便的對(duì)Domain Model進(jìn)行設(shè)計(jì)模式的強(qiáng)粒度運(yùn)用;

重構(gòu)的運(yùn)用:對(duì)領(lǐng)域模型進(jìn)行重構(gòu)就不需要考慮業(yè)務(wù)邏輯會(huì)影響到其他層面;

單元測(cè)試的運(yùn)用:可以獨(dú)立對(duì)領(lǐng)域模型進(jìn)行測(cè)試,包括細(xì)粒度的接口抽取都會(huì)很方便;

總結(jié):由于時(shí)間關(guān)系文中都是精簡(jiǎn)的介紹,具體的理解可以參考我上傳的代碼示例:http://files.cnblogs.com/wangiqngpei557/3WDDDDemo.zip


作者:王清培

出處:http://wangqingpei557.blog.51cto.com/

本文版權(quán)歸作者和51CTO共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI