.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进行自动化测试
在后续文章中,我将提供有关在解决方案中如何使用上述技术的更多详细信息。