標籤:

基於.Net Core的DDD架構搭建

話說這2017年過的真是悲慘,開年就忙到現在,各種雜事屁事一大堆,個中心酸就不說了,所幸終於迎來了五一小長假,能夠暫時輕鬆一下,做點自己的事情了。翻了下自己的github,滿滿的一大堆坑等著填,有一些乾脆棄掉算了(劃掉)……

說說而已……總之自己挖的坑還是要填的,想了想就先從最老的QRFramework填起好了。(再往前不是還有么?不好意思我棄坑了~)

QR是我最早搭建的一個採用領域驅動設計思想,基於.NET MVC5,EF6的Web開發架構。這套架構,脫胎於我剛畢業時在第一家互公司里技術主管所編寫的YooPoonFramework,然後我技術主管又是從他就職的第一家公司NewEgg里學會的……反正也就是那麼個老東西了,當然,領域驅動設計的思想也誕生了10多年,各種各樣的實現那都是有的。不管怎麼說,畢竟是自己接觸的一個架構,而且開發起來也很舒服,用的開心就好啦~

關於我所理解的領域驅動設計:DDD是一種架構設計思想,以業務為倒向,通過構建業務模型來確定軟體的核心和邊界,我們不必過於糾結其中的專業術語,了解DDD的目的和要解決的問題,理解為什麼要Domain Driven才是最重要的,很多人都在用這個套路,然而他們也許就根本沒聽過領域驅動設計這個名詞,Who cares?解決問題就行。

也是恰逢VS2017剛出,.net core也出了一年了,基本可以做跨平台開發了,希望這次的微軟能鋼一波吧~所以我翻新了下架構,整體設計思路還是以領域驅動設計為主,雖然都說沒有銀彈,但依然希望能有一個用的久一點的玩意,以後干點啥也方便是不(並不)。

話說在新的VS2017和Reshaper加持下,新版的QRFrameworkCore基於.net core 1.1.1,開發起來絲般順滑,完全沒有VS2015上處處蹩腳的感受,一個字:爽!

下面是純色的架構圖……

整體架構還是DDD的四層架構:UserInterface-介面層,Application-應用層,Domain-領域層和Infrastructure-基礎設施層。

UserInterFace-介面層:用於與其他系統進行交互的介面和通信設施,主要注意的是Facade部分本身不處理任何的業務邏輯,主要將一個用戶請求為委派給一個或者多個Service處理。

Dto的存在主要是因為基於領域對象的實體(Entity)都是細粒度的,採用一個粗粒度的Dto多個Entity進行包裹可以優化傳輸,以及在傳輸過程中對實體進行清洗過濾等等……

Application-應用層:系統所能對外提供的功能,各種各樣的service充斥其中……需要值得注意的是Service可以直接越過Domain層。這個在下面講。

Domain-領域層:包含整個應用的所有業務邏輯,每個Domain都有一個聚合根和多個聚合,設計上Service是可以直接跨過Domain層的,Domain層完全是一個可選的對象,因為這裡的Domain並不是領域,而是領域層的一個再細分,其實很大一部分業務並沒有複雜到需要再拆解的情況,這時候Domain層顯的比較冗餘,可以完全在service中單獨實現。

一個可供參考的圖(並不)……

Infrastructure-基礎設施層:提供整個應用的基礎服務。其中最重要的一塊Data:包含Cache和ROM等對象,由Repository提供上層支持,Models作為數據模型充斥整個領域的交互。至於其他的IOC啊,Log啊,新的.net core里已經自帶了,用了下還是蠻好用的,至於和第三方的效率相比還沒測過,不過微軟自己的,還是值得信賴的。

在網上查相關資料的時候發現很多人對Repository層的存在不理解,其實Repository是為了解除Domain層對Dal層的依賴所產生的,Repository就像倉庫管理員,上層不需要關心東西存在哪,只要知道找倉管要就行了,這樣就達到對Domain層解耦的目的。好比我要把ORM換掉,EF改成NH這時候就不會有影響了,當然這個行為本身就很影響……

最近.net用的越來越少了,周邊的小夥伴全去做JAVA了,攜程的朋友們也都在轉JAVA,可以說生態逼的.net變得小眾,我也沒辦法啦~其實搭完這個架構,我也要去轉JAVA了……真是個凄涼的故事呢~


推薦閱讀:

TAG:aspnetcore |