1. 程式人生 > >從壹開始微服務 [ DDD ] 之一 ║ D3模式設計初探 與 我的計劃書

從壹開始微服務 [ DDD ] 之一 ║ D3模式設計初探 與 我的計劃書

緣起

哈嘍大家週四好!又是開心的一天,時間過的真快,我們的 《從壹開始 .net core 2.1 + vue 2.5 》前後端分離系列共 34 篇已經完結了,當然以後肯定還會有更新和修改,直接在文章內更新,並在文章開頭做提醒,如果有大的改動或者新功能,會在目錄頁進行重點說明(可能簡書的更新速度沒有部落格園快,如果有任何疑問,可以先看部落格園的文章,就是上邊的這個地址?)。如果你是剛看到我的文章,而且恰好對.net core 不是很明白,或者想了解下如何前後端完全分離的,可以先看看上一個系列,我已經把 .net corevue 的內容明顯分開了,同時也把 vue 的基礎部分入門教程

兩個部分進行說明,相信大家都能看的明白。

  關於這一個系列,我想了很久,本來想開下 React 系列的,但是群裡的小夥伴的反映,.net 後端還有很多東西,而且好多小夥伴反映課本太苦澀,看不進去,文件又太少,國內的大神好像也不太照顧我們這些小學生,特別是很少通過程式碼的形式講解,那所以我就開了這個系列,雖然感覺會坎坷波折,本系列會從一個空的 Solution 到一個 完整 Project 的過程,具體的會在下邊的計劃書中詳細說明,大家可以一會兒瞭解下,當然,框架本來就很見仁見智,思想設計更是沒有常規法去定義,可能會有人不同意,老張希望如果有不同意見,別僅僅只是點選一下反對,可以發表下評論

嘛,也算是給 .net 生存環境做點兒貢獻,當然這個是練習專案,實際情況還要按照公司的要求來寫,甚至公司都用不到(但是可能會面試的時候問到),一些小夥伴就會問,那我為啥要學,嗯~~~要是這麼問,我也不知道如何回答了 [苦笑] ,就好像健身一樣。

  我給這個專案取名: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領域驅動設計的相關說明,還是那句話,技術是用來改善生活的,沒有一成不變的好框架,也沒有一無是處的設計思想,關鍵還是看學習者是一個什麼心態罷了,江湖渺渺,各位仁兄任重而道遠呀,加油吧兄弟們~~~