.NET Core整潔架構(Clean Architecture):入門
翻譯自:https://jasontaylor.dev/clean-architecture-getting-started/
在過去的兩年中,我走遍世界,教程序員如何使用帶有.NET Core的整潔架構來構建企業應用程序。我首先使用標志性的Northwind Traders數據庫提供了示例解決方案。最近,我為.NET Core開發了一個新的整潔架構解決方案模板。
這篇文章概述了整潔架構,並介紹了一套新的整潔架構解決方案模板,這是一個基於.NET Core的項目模板,用於基於Angular,ASP.NET Core 3.1和Clean Architecture構建應用程序。
讓我們先從整潔架構概述開始吧!
概述
在整潔架構中,領域層和應用程序層是設計的中心。這被稱為系統的核心。
領域層包含企業邏輯和類型,應用程序層包含業務邏輯和類型。區別在於企業邏輯可以在許多系統之間共享,而業務邏輯通常僅在該系統內使用。
核心層不應依賴於數據訪問層和其他基礎結構層,這些依賴關系可以通過控制反轉實現。這是通過在核心層中添加由核心層外部各層實現的接口或抽象來實現的。例如,如果要實現倉儲模式,可以通過在核心層中添加接口並在基礎設施層中添加實現來達到目的。
所有依賴關系都向內流動,而核心層不依賴於其他任何層。基礎設施層和展示層依賴於核心層,而不是彼此依賴。
結合上面的原則,整潔架構的設計如下:
- 不依賴框架 它不是依賴某種工具或框架的存在
- 易於測試 核心層不依賴於外部任何層,因此編寫自動化測試要容易得多
- 獨立與UI邏輯 業務邏輯不包含在UI中,因此可以輕松地更改為另一種技術–現在,您可能正在使用Angular,以后可能會用Vue或Blazor!
- 獨立於數據庫 數據訪問方與業務邏輯已完全分開,因此可以輕松地從SQL Server遷移到CosmosDB或其他數據庫
- 不依賴於任何外部事物 事實上,核心層是完全與外部世界隔離的——這是一個持續3年的系統與一個持續20年的系統之間的區別
在上面的設計中,只有三個圓圈,您可能需要更多。將此視為起點。只要記住讓所有依賴項指向內部即可。
讓我們來看一個使用新的整潔架構解決方案模板的簡單實現。
解決方案模板
該模板為基於ASP.NET Core 3.1和Angular 8,並遵循整潔架構原則的解決方案提供了一種很好的方法。如果你不用Angular,請不用擔心,可以輕松將其替換掉。在本節中,您將安裝模板,創建新的解決方案,並查看生成的代碼。
准備工作
第一步是確保您的開發環境滿足以下先決條件:
- .NET Core SDK (3.1 or later)
- Node.js (6 or later)
通過運行以下命令檢查.NET Core版本:
dotnet --list-sdks
通過運行以下命令檢查節點版本:
node -v
接下來,使用以下命令安裝解決方案模板:
dotnet new --install Clean.Architecture.Solution.Template
創建一個新的解決方案
創建新的解決方案很簡單。在一個空文件夾中,運行以下命令:
dotnet new ca-sln
將顯示以下消息
The template "Clean Architecture Solution" was created successfully.
該命令將創建一個新的解決方案,並使用父文件夾的名稱自動命名。例如,如果父文件夾名為Northwind,則解決方案將命名為Northwind.sln,默認命名空間為Northwind。
該解決方案是使用帶有ASP.NET Core的Angular項目模板構建的。ASP.NET Core項目提供API后端服務,而Angular CLI項目提供UI層展示。
Note
Read Use the Angular project template with ASP.NET Core to learn more about this approach.
在Visual Studio 2019啟動解決方案很簡單,只需按F5鍵即可。
為了使用.NET Core CLI啟動解決方案,還需要執行幾個步驟。您可以通過上面的鏈接了解更多信息,但是為了完整起見,我將在此處提供這些信息。
首先,您將需要一個名為ASPNETCORE_Environment
的環境變量,其值為Development
。在Windows上,運行SET ASPNETCORE_Environment=Development
。在Linux或macOS上,運行export ASPNETCORE_Environment = Development
。
接下來,在解決方案文件目錄下運行以下命令:
cd src/WebUI
dotnet build
注意
初始構建將花費幾分鍾,因為它還將安裝所需的客戶端軟件包。隨后的構建將更快。
然后運行dotnet run啟動應用程序。將顯示以下消息:
Now listening on: https://localhost:[port]
端口通常是5001。通過導航到https//localhost:port來打開網站。
注意
您還將看到類似以下消息:
NG Live Development Server is listening on localhost:port, open your browser on http://localhost:port
忽略此消息,它不是合並后的URL
如果一切順利,您將看到以下內容:
讓我們看一下新生成的解決方案的結構。
解決方案結構
解決方案模板生成一個多項目解決方案。對於名為Northwind的解決方案,將創建以下文件夾結構:
src中的項目名稱嚴格按照上面Clean Architecture圖的各層命名,唯一的例外是WebUI,它表示Presentation層。
Domain項目代表領域層,包含企業或領域邏輯,並且包含特定於領域層的實體,枚舉,異常,接口,類型和邏輯。該層不依賴外部任何項目。
Application項目代表應用層,並包含所有業務邏輯。該項目實現了CQRS(命令查詢責任隔離),每個業務用例均由單個命令或查詢表示。該層依賴於領域層,但不依賴於任何其他層或項目。該層定義了由外部層實現的接口。例如,如果應用程序需要訪問通知服務,則將新接口添加到應用程序,並在基礎架構中創建實現。
Infrastructure項目代表基礎設施層,並包含用於訪問外部資源(例如文件系統,Web服務,SMTP等)的類。這些類應基於在應用程序層內定義的接口。
WebUI項目表示展示層。該項目是基於Angular 8和ASP.NET Core的SPA(單頁應用程序)。該層依賴於應用層和基礎設施層。請注意,對基礎結構的依賴關系僅支持依賴關系注入。因此,Startup.cs應該包括對基礎設施層的唯一引用。
測試
tests文件夾包含許多單元和集成測試項目,以幫助您快速啟動和運行。這些項目的詳細信息將在后續文章中進行探討。同時,請隨時聯系探索和詢問任何問題。
技術
除了.NET Core,此解決方案中還使用了許多技術,包括:
- MediatR實現CQRS
- FluentValidation
- AutoMapper
- Entity Framework Core
- ASP.NET Core Web API
- Angular 8
- Open API with NSwag
- ASP.NET Core Identity + IdentityServer
- xUnit.net,Moq和Shouldly進行自動化測試
在后續文章中,我將提供有關在解決方案中如何使用上述技術的更多詳細信息。
其他資源
在這篇文章中,我提供了Clean Architecture和新解決方案模板的概述。如果您想了解有關這些主題的更多信息,請查看以下資源: