大家好,我是張飛洪,感謝您的閱讀,我會不定期和你分享學習心得,希望我的文章能成為你成長路上的墊腳石,讓我們一起精進。
最近嘗試錄製了一個系列視訊:《ASP.NET Core 6.0+Vue.js 3 實戰開發》,本節是視訊內部整潔架構的理論和實戰的文字稿。因為在錄製之前,我通常會編寫完整的文字內容作為視訊文案,這裡分享給大家,希望對你有所幫助。如果您能捧個人場,訂閱我的視訊,感激不盡。
雖然是收費的視訊,但是我的分享不會止步,再次感謝您的閱讀。
本章將介紹基於ASP.NET Core的整潔架構的設計理念,同時基於理論落地的程式碼模型,包括資料夾、檔案、專案的組織形式以及專案的依賴關係,為企業級可延伸的架構奠定基礎。
本章學習主題包括:
很多公司系統多樣,每個系統的分層結構各不相同,這給開發和未來的運維帶來了巨大的成本,分層架構看似很簡單,但保證整個研發中心都使用統一的分層架構就不容易了。
那麼如何保證整個研發中心都使用統一的分層架構,以達到提高編寫程式碼效率、保證工程統一性的目的?
我們推薦行業內目前比較流行的整潔架構。
整潔架構是什麼?簡而言之,它是組織軟體體系結構的原則,可以輕鬆面對未來的不確定性,方便程式碼的重構。同時,它可以幫助我們為特定的領域模型構建服務,從而為將來可能的微服務體系結構做好準備。
我們看下整潔架構的洋蔥示意圖:
在整潔架構中,領域層(Domain)和應用層(Application)是架構的核心層。領域層包含實體、列舉和常數設定等,應用層則包含資料傳輸物件(DTO)、介面、對映、異常、行為和業務邏輯。
整潔架構和傳統三層架構的不同之處在於依賴的不同,因為企業的核心邏輯是可以跨系統共用的,而應用邏輯或業務邏輯是特定的。所以為了複用,現在,我們不再讓核心層依賴資料存取和基礎設施,而是顛倒這些依賴關係。如上圖所示,表示層和基礎設施層現在是依賴於我們的核心層,但核心層對任何一層都沒有依賴性。
這種架構必須通過在應用層內新增抽象或介面來實現,這些抽象或介面是在應用層之外的其他層實現的。例如,如果我們想要實現儲存庫模式(Repository),我們一般會在應用層新增一個IRepository介面,而實現放在基礎設施層。
有了這個設計原則,所有依賴項都指向圓的重心,而最內部的領域層對其他層沒有任何依賴性。隨後,表示和基礎設施層依賴於核心層,而不是彼此依賴。這一點非常重要,因為我們希望確保該系統的邏輯保留在核心內,這樣我們就可以重用業務邏輯。我們舉個反例,如果表示層依賴基礎設施層,那麼在發生簡訊通知的時候,這個邏輯就會停留在表示層中,因為它必須協調錶示層和基礎設施層之間的互動,如果是這樣,未來我們就很難重用這種邏輯。
如果洋蔥示意圖不好理解,我們可以結合下面扁平化的示意圖來理解。
扁平示意圖:
我們看到我們的應用層處在最底下,它沒有任何依賴項。基礎設施層依賴於應用層,最後整個應用程式變得高度可測試,我們可以快速編寫單元測試、整合測試和功能測試。
下面,我們將把每一層的職責逐步展開介紹,最後我們會通過程式碼(基於.NET 6.0)把整潔架構這套理念落地到我們的解決方案當中。
核心層是整潔架構的中心,因為它本身不會依賴於其他層。核心層包含兩個專案,分別是.Domain和.Application,下面展開描述:
1)領域層(Domain)專案
.Domain專案是一個.NET Standard 2.1類庫,它包含實體、介面、列舉、DTO等。
領域專案必須有一個空的專案參照,這表明它對任何專案都沒有依賴關係。
2)應用層(Application)專案
.Application專案也是一個.NET Standard 2.1類庫,它定義了介面,但實現不在這一層。該專案還具有CQRS模式的命令和查詢、MediatR的行為、AutoMapper物件對映、異常、模型等。
思考:
如果我們要構建微服務,並意識到核心層中有程式碼會在其他服務中重用,該怎麼辦?
答案:
我們可以抽象出一個共用專案(.Shared),可以作為一個NuGet包,在微服務中共用程式碼。
基礎設施層包含應用層中定義的介面的實現,內部還包括SMTP、檔案系統或web服務等資源,都在這一層中實現。
該層是解決方案中的另一個資料夾目錄,內部包括多個專案,比如資料層和共用層,另外我們還可以新增Identity的專案進行身份驗證(這裡暫時省略)。
1)資料(Data)專案
資料專案是一個NET 6.0類庫專案,用於資料庫持久化,內部包括倉儲類、實體類、資料遷移等內容。
2)共用(Shared)專案
共用專案也是一個NET 6.0類庫專案,該專案包含了不同服務之間的共用程式碼,比如電子郵件、簡訊或日期等。
展示層是構建web應用程式的地方,我們可以使用ASP.NET Core MVC、ASP.NET Core Web API、單頁應用程式(SPA)或移動應用程式。
1)Web API專案
本視訊會使用一個Web API專案和一個網站作為案例演示。
WebApi是基於.NET 6.0構建的一個ASP NET Web API專案,可與任何使用者端應用程式互動,例如web、移動、桌面和物聯網(IoT)。
此外,WebApi依賴於應用層和基礎設施層。
2)使用者端專案
使用者端專案用於使用者介面的展示,我們將採用Vue.js 3進行搭建(在第11節介紹),它也將被歸類在展示層。
測試管理專案並不是整潔架構原則的一部分,但是這裡也一併介紹。因為,基於測試驅動的開發是一種好的程式設計習慣,這裡的測試包括單元測試、功能測試、整合測試和負載測試等。
1)單元測試專案
單元測試是測試程式碼的小部分程式碼,比如特定的方法或者服務。可以使用XUnit、NUnit或MSTest專案建立此專案。
2)整合測試專案
整合測試是測試類庫或元件是否能在一起工作。可以使用XUnit、NUnit或MSTest專案建立此專案。
現在,我們已經完成整潔架構的整體介紹,是時候編碼實現了。
本小節將通過程式碼落地一個基於整潔架構的物聯網解決方案。該專案的目標是適用大部分物聯網場景,管理員可以在其中新增、刪除、更新和讀取物模型。
本視訊的所有命令列都可以在我的部落格上獲得,不想敲命令的同學可以自行獲取。
開始之前,請先開啟終端並導航到專案檔案的目錄中。
我這裡使用的Hyper終端,對於Windows使用者,請使用PowerShell或Git Bash終端。如果使用PowerShell,請記住使用反斜槓而不是正斜槓。
建立解決方案如果使用IDE(比如Visual Studio 2022)會簡單很多,這裡使用命令列有個用意,一個是嚐鮮,瞭解命令的構建方式;另一個是考慮將來可能的CI/CD,為自動化開發做準備。
1)建立解決方案
我們執行以下命令建立一個iot資料夾:
mkdir iot
然後進入該目錄:
cd iot
使用dotnet CLI建立一個解決方案:
dotnet new sln
該命令預設使用目錄名稱iot作為解決方案的名稱。
接著,在iot目錄中建立一個src資料夾:
mkdir src
現在,進入src目錄,並分別建立三個目錄:
cd src
mkdir 1.core
mkdir 2.infrastructure
mkdir 3.presentation
2)建立core資料夾
一級目錄和資料夾建立完成後,我們進入core資料夾:
cd 1.core
在core目錄中,我們將建立兩個專案Iot.Domain和Iot.Application:
dotnet new classlib -f netstandard2.1 --name Iot.Domain
dotnet new classlib -f netstandard2.1 --name Iot.Application
以上兩個專案都是基於.NET Standard 2.1,現在進入Iot.Application目錄並建立對Iot.Domain的依賴關係:
cd Iot.Application
dotnet add reference ../Iot.Domain/Iot.Domain.csproj
3)建立infrasturcture資料夾
接下來,我們轉入infrasturcture目錄:
cd ../../2.infrastructure
在該目錄中,我們建立兩個基於.NET 6.0的專案,分別是Iot.Data和Iot.Shared:
dotnet new classlib -f net6.0 --name Iot.Data
dotnet new classlib -f net6.0 --name Iot.Shared
接下來,進入Iot.Data目錄:
cd Iot.Data
建立對Iot.Domain和Iot.Application的依賴
dotnet add reference ../../1.core/Iot.Domain/Iot.Domain.csproj
dotnet add reference ../../1.core/Iot.Application/Iot.Application.csproj
現在,轉到Iot.Shared目錄:
cd ../Iot.Shared
建立對Iot.Application的依賴
dotnet add reference ../../1.core/Iot.Application/Iot.Application.csproj
4)建立presentation資料夾
轉到presentation目錄:
cd ../../3.presentation
建立WebApi專案,並轉入到Iot.WebApi:
dotnet new webapi --name Iot.WebApi
cd Iot.WebApi
建立對Iot.Application和Iot.Data的依賴
dotnet add reference ../../1.core/Iot.Application/Iot.Application.csproj
dotnet add reference ../../2.infrastructure/Iot.Data/Iot.Data.csproj
接下來,建立對Iot.Shared的依賴:
dotnet add reference ../../2.infrastructure/Iot.Shared/Iot.Shared.csproj
5)註冊專案到解決方案
轉到解決方案所在的根目錄:
cd ../../../
註冊所有的專案到解決方案,註冊順序依次:
dotnet sln add src/1.core/Iot.Domain/Iot.Domain.csproj
dotnet sln add src/1.core/Iot.Application/Iot.Application.csproj
dotnet sln add src/2.infrastructure/Iot.Data/Iot.Data.csproj
dotnet sln add src/2.infrastructure/Iot.Shared/Iot.Shared.csproj
dotnet sln add src/3.presentation/Iot.WebApi/Iot.WebApi.csproj
至此,我們已經通過.NET CLI完成了我們解決方案的實現,接下來我們關閉終端並使用Visual Studio 2022開啟我們的解決方案,如圖3-3所示:
整潔架構的解決方案示意圖:
通過本節的學習,我們瞭解了什麼是整潔架構,整潔架構的模組內容以及依賴關心,以及它將如何幫助開發人員構建可延伸、可演化、可測試的應用程式,比如為將來從單體向微服務演化打下一定的基礎。
另外,我們還學習瞭如何在整潔架構中構造測試,最後,如何通過dotnet CLI構建ASP.NET Core的解決方案。
在下一節中,我們將設定我們的資料庫並構建路由和控制器,以瞭解它們如何處理HTTP請求。
如果你閱讀了全文覺得質量還可以,希望您能給我捧捧場,非常感謝。