從壹開始微服務 [ DDD ] 之一 ║ D3模式設計初探 與 我的計劃書
緣起
哈嘍大家週四好!又是開心的一天,時間過的真快,我們的 《從壹開始 .net core 2.1 + vue 2.5 》前後端分離系列共 34 篇已經完結了,當然以後肯定還會有更新和修改,直接在文章內更新,並在文章開頭做提醒,如果有大的改動或者新功能,會在目錄頁進行重點說明(可能簡書的更新速度沒有部落格園快,如果有任何疑問,可以先看部落格園的文章,就是上邊的這個地址?)。如果你是剛看到我的文章,而且恰好對.net core 不是很明白,或者想了解下如何前後端完全分離的,可以先看看上一個系列,我已經把 .net core 和 vue 的內容明顯分開了,同時也把 vue 的基礎部分和入門教程
兩個部分進行說明,相信大家都能看的明白。
關於這一個系列,我想了很久,本來想開下 React 系列的,但是群裡的小夥伴的反映,.net 後端還有很多東西,而且好多小夥伴反映課本太苦澀,看不進去,文件又太少,國內的大神好像也不太照顧我們這些小學生,特別是很少通過程式碼的形式講解,那所以我就開了這個系列,雖然感覺會坎坷波折,本系列會從一個空的 Solution 到一個 完整 Project 的過程,具體的會在下邊的計劃書中詳細說明,大家可以一會兒瞭解下,當然,框架本來就很見仁見智,思想設計更是沒有常規法去定義,可能會有人不同意,老張希望如果有不同意見,別僅僅只是點選一下反對,可以發表下評論
我給這個專案取名:ChristD3,意思是聖誕節DDD,希望到聖誕節的時候可以完結,因為年底手中工作比較多,所以不會每天都寫,但是每週肯定會有更新,也希望大家可以多多提意見,為了.net 的生存環境點贊加油吧!其實如果你已經開完了我寫的上一個系列,你會發現其實上一個系列已經有 DDD 的影子了,不信?看完本文你就會知道了。
簡單強調:
1、本系列重點通過程式碼進行說明,那些苦澀的概念可能比較少,特別是本文,是簡要說明,具體的詳細內容在之後文章中體現。
2、本系列只是對知識點進行講解,重點在說明新知識上,只是一個很小的框架,資料也很簡單,可能還是一個簡單的個人部落格之類的,請不要和企業級專案對比。
3、本系列還是沿用上一個系列的宗旨:旨在拋磚引玉,想要學會還得自己多思考,文中會有兩本參考書,可以看看。
目錄:
以後更新的文章會在這裡一一更新:
一、今天要實現紅色的部分
二、DDD領域驅動設計的前世今生
好多小夥伴都在說,聽DDD都聽了好幾年了,感覺就像是空氣一樣,一直在身邊,可是一直摸不著,雖然有時候用到一些,可都是無法具體深入的對其描述和總結,那領域驅動設計到底是怎麼來的呢,在早期專案開發中,我們主要就是單系統來進行開發,很多的模板都是揉在一起,其實現在咱們平時用的最多的MVC架構也有這樣的問題,然後近來演化出的前後端分離,是從協同開發的角度方向去改善單系統問題,而DDD則是從後端整體框架中,對專案進行整合,剝離,細分和聯絡通訊等等,這樣面向領域驅動設計就出現了。
1、DDD領域驅動設計知多少
首先要知道DDD是一種開發理念,核心是維護一個反應領域概念的模型(領域模型是軟體最核心的部分,反應了軟體的業務本質),然後通過大量模式來指導模型設計與開發。
DDD的一般過程是:首先通過軟體需求規格說明書或原型生成一個領域模型(類、類的屬性、類與類之間的關係);然後根據模式(應該如何分層?、領域邏輯寫在哪?與持久化如何互動?如何協調多物件領域邏輯?如何實現邏輯與資料儲存解耦等)指導來實現程式碼模型。
DDD中最核心的是Domain Model(領域模型),和領域模型相對的是事務指令碼。領域模型和事務指令碼說到底就是面向物件和麵向過程的區別。
如果感覺上邊的理解有點兒苦澀,這裡舉個栗子:
我認為任何一個系統都會屬於某個特定的領域,比如論壇是一個領域,只要你想做一個論壇,那這個論壇的核心業務是確定的,比如都有使用者發帖、回帖等核心基本功能。比如電商平臺、普通電商系統,這種都屬於網上電商領域,只要是這個領域的系統,那都有商品瀏覽、購物車、下單、減庫存、付款交易等核心環節。所以,同一個領域的系統都具有相同的核心業務,因為他們要解決的問題的本質是類似的。
因此,我們可以推斷出,一個領域本質上可以理解為就是一個問題域,只要是同一個領域,那問題域就相同。所以,只要我們確定了系統所屬的領域,那這個系統的核心業務,即要解決的關鍵問題、問題的範圍邊界就基本確定了。
關於電商系統大家肯定都很瞭解了,什麼商品模組,使用者模板,訂單模板,等等等等,這個就是領域模型的一個體現,網上看到一個很好的文章,他對普通電商的訂單中心進行建模,如圖:
2、領域驅動設計整體架構
那從整體架構上來說,主要分成以下四個部分,具體的在下一講的專案整體搭建中會詳細說明:
- Presentation Layer:表現層,負責顯示和接受輸入;
- Application Layer(Service):應用層,很薄的一層,只包含工作流控制邏輯,不包含業務邏輯;
- Domain Layer(Domain):領域層,包含整個應用的所有業務邏輯;
- Infrastructure Layer:基礎層,提供整個應用的基礎服務;
DDD領域驅動設計的優點就包括:
1.從技術維度實現分層:能夠在每層關注自己的事情,比如領域層關注業務邏輯的事情,倉儲關注持久化資料的事情,應用服務層關注用例的事情,介面層關注暴露給前端的事情。
2.業務維度:通過將大系統劃分層多個上下文,可以讓不同團隊和不同人只關注當前上下文的開發。
3.時間維度:通過敏捷式迭代快速驗證,快速修正。
3、有哪些資料可以參考
書籍:
2004年,Eric Evans的《領域驅動設計——軟體核心複雜性應對之道》
2014年,Vaughn Vernon的《實現領域驅動設計》,個人推薦
大神部落格:
http://www.cnblogs.com/farb/p/ABPTheory.html
https://www.cnblogs.com/netfocus/p/5548025.html
http://www.cnblogs.com/daxnet/archive/2010/11/02/1867392.html
三、我的計劃書中涉及到的相關知識
Bingo:這裡是我的一個初步設想,以後可能根據情況進行增刪,其中很多咱們在之前的專案裡都已經說到了,到時候會簡單說一下跳過,也正好溫習下,比如 WebApi的建立,依賴注入的使用,Dto資料傳輸物件的概念,Swagger 介面文件的使用,這些大家是不是很熟悉,所以說,當時在寫上一個專案的時候,已經用了一部分DDD的思想了,現在回想起來是不是感覺自己棒棒噠。至於不懂或者沒見過的,沒關係,以後都會懂得的。
1、知識點(補充中)
- ASP.NET Core 2.1.2 ?基本框架
- ASP.NET MVC Core ?實現mvc web頁面
- ASP.NET WebApi Core ?實現 api 介面
- ASP.NET Identity Core ?身份驗證
- Entity Framework Core 2.0 ?實現ORM資料持久化
- Dapper (待定)
- .NET Core 原生 DI ?實現依賴注入
- AOP ?面向切面
- Autofact(待定)IoC
- AutoMapper ?實現Dtos
- FluentValidator驗證
- Swagger UI ?實現介面文件展示
- MediatR ?基於記憶體級別的訊息釋出訂閱
- Azure ?雲服務釋出
2、特性(補充中)
- 領域驅動設計(Domain Driven Design (Layers and Domain Model Pattern)
- 命令查詢職責分離(CQRS:Command Query Responsibility Segregation)
- 領域通知 (Domain Notification)
- 領域驅動 (Domain Events)
- 事件驅動架構 (EDA)
- 事件回溯 (Event Sourcing)
- 最終一致性 (Eventually Consistent)
- 工作單元模式 (Unit of Work )
- 泛型倉儲 (Repository and Generic Repository)
四、開發環境與專案設想
這裡再強調下,這個系列只為了說明知識點內容,可能資料很少,框架很簡單。
系統環境
windows 10、SQL server 2012、Visual Studio 2017、Windows Server 2008 R2、Linux Ubuntu、
開發環境
Visual Studio 15.3+、.NET Core SDK 2.0+、
如果順利的話,會引入下邊這些東西,如果上邊講起來很費勁,可能就順延下去了:
1、到時候肯定會有一個 WebApi 專案,如何基於這個,可以再一次搭建一個前後端分離的前端框架,至於還是 VUE,還是 Angular 6,這個再說;
2、然後會有一個 MVC 專案,很簡單,就是一個頁面的展示,主要是為了講解如何搭建 .net core MVC 專案;
3、儘量實現資料的讀寫分離;
4、實現 Dockers 的容器使用;
5、OAuth 2.0 許可權等;
五、結語
本文只是簡單給大家見個面,初略說明本系列要說什麼,以及DDD領域驅動設計的相關說明,還是那句話,技術是用來改善生活的,沒有一成不變的好框架,也沒有一無是處的設計思想,關鍵還是看學習者是一個什麼心態罷了,江湖渺渺,各位仁兄任重而道遠呀,加油吧兄弟們~~~