基于ASP.NET Core 6.0的整洁架构

背景

最近尝试录制了一个系列视频:《ASP.NET Core 6.0+Vue.js 3 实战开发》,本节是视频内部整洁架构的理论和实战的文字稿。因为在录制之前,我通常会编写完整的文字内容作为视频文案,这里分享给大家,希望对你有所帮助。如果您能捧个人场,订阅我的视频,感激不尽。
虽然是收费的视频,但是我的分享不会止步,再次感谢您的阅读。

视频地址

点击跳转: https://appstv6elnt7382.h5.xiaoeknow.com/

文章主题

本章将介绍基于ASP.NET Core的整洁架构的设计理念,同时基于理论落地的代码模型,包括文件夹、文件、项目的组织形式以及项目的依赖关系,为企业级可扩展的架构奠定基础。
本章学习主题包括:

  • 整洁架构介绍

  • 核心层

  • 基础设施层

  • 表示层

  • 测试管理

  • 构建整洁架构解决方案

3.1 整洁架构介绍

很多公司系统多样,每个系统的分层结构各不相同,这给开发和未来的运维带来了巨大的成本,分层架构看似很简单,但保证整个研发中心都使用统一的分层架构就不容易了。
那么如何保证整个研发中心都使用统一的分层架构,以达到提高编写代码效率、保证工程统一性的目的?
我们推荐行业内目前比较流行的整洁架构。
整洁架构是什么?简而言之,它是组织软件体系结构的原则,可以轻松面对未来的不确定性,方便代码的重构。同时,它可以帮助我们为特定的领域模型构建服务,从而为将来可能的微服务体系结构做好准备。
我们看下整洁架构的洋葱示意图:
0711be5e7e1f6acf3476063322c56039.png

在整洁架构中,领域层(Domain)和应用层(Application)是架构的核心层。领域层包含实体、枚举和常量设置等,应用层则包含数据传输对象(DTO)、接口、映射、异常、行为和业务逻辑。
整洁架构和传统三层架构的不同之处在于依赖的不同,因为企业的核心逻辑是可以跨系统共享的,而应用逻辑或业务逻辑是特定的。所以为了复用,现在,我们不再让核心层依赖数据访问和基础设施,而是颠倒这些依赖关系。如上图所示,表示层和基础设施层现在是依赖于我们的核心层,但核心层对任何一层都没有依赖性。
这种架构必须通过在应用层内添加抽象或接口来实现,这些抽象或接口是在应用层之外的其他层实现的。例如,如果我们想要实现存储库模式(Repository),我们一般会在应用层添加一个IRepository接口,而实现放在基础设施层。
有了这个设计原则,所有依赖项都指向圆的重心,而最内部的领域层对其他层没有任何依赖性。随后,表示和基础设施层依赖于核心层,而不是彼此依赖。这一点非常重要,因为我们希望确保该系统的逻辑保留在核心内,这样我们就可以重用业务逻辑。我们举个反例,如果表示层依赖基础设施层,那么在发生短信通知的时候,这个逻辑就会停留在表示层中,因为它必须协调表示层和基础设施层之间的交互,如果是这样,未来我们就很难重用这种逻辑。
如果洋葱示意图不好理解,我们可以结合下面扁平化的示意图来理解。

扁平示意图:
2d85f7755987a10a4416414058833ff4.png

我们看到我们的应用层处在最底下,它没有任何依赖项。基础设施层依赖于应用层,最后整个应用程序变得高度可测试,我们可以快速编写单元测试、集成测试和功能测试。
下面,我们将把每一层的职责逐步展开介绍,最后我们会通过代码(基于.NET 6.0)把整洁架构这套理念落地到我们的解决方案当中。

  • 核心层(Core)将包含应用项目和领域项目;

  • 基础设施层(Infrastructure)将包含数据和共享项目;

  • 展示层(Presentation)将包含一个WebApi项目。
    以上就是基于NET Core解决方案的项目设置和文件夹安排。

3.1.1 核心层(Core)

核心层是整洁架构的中心,因为它本身不会依赖于其他层。核心层包含两个项目,分别是.Domain和.Application,下面展开描述:
1)领域层(Domain)项目
.Domain项目是一个.NET Standard 2.1类库,它包含实体、接口、枚举、DTO等。
领域项目必须有一个空的项目引用,这表明它对任何项目都没有依赖关系。
2)应用层(Application)项目
.Application项目也是一个.NET Standard 2.1类库,它定义了接口,但实现不在这一层。该项目还具有CQRS模式的命令和查询、MediatR的行为、AutoMapper对象映射、异常、模型等。

思考:
如果我们要构建微服务,并意识到核心层中有代码会在其他服务中重用,该怎么办?
答案:
我们可以抽象出一个共享项目(.Shared),可以作为一个NuGet包,在微服务中共享代码。

3.1.2 基础设施层

基础设施层包含应用层中定义的接口的实现,内部还包括SMTP、文件系统或web服务等资源,都在这一层中实现。
该层是解决方案中的另一个文件夹目录,内部包括多个项目,比如数据层和共享层,另外我们还可以添加Identity的项目进行身份验证(这里暂时省略)。

1)数据(Data)项目
数据项目是一个NET 6.0类库项目,用于数据库持久化,内部包括仓储类、实体类、数据迁移等内容。

2)共享(Shared)项目
共享项目也是一个NET 6.0类库项目,该项目包含了不同服务之间的共享代码,比如电子邮件、短信或日期等。

3.1.3 展示层

展示层是构建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节介绍),它也将被归类在展示层。

3.1.4 测试管理

测试管理项目并不是整洁架构原则的一部分,但是这里也一并介绍。因为,基于测试驱动的开发是一种好的编程习惯,这里的测试包括单元测试、功能测试、集成测试和负载测试等。
1)单元测试项目
单元测试是测试代码的小部分代码,比如特定的方法或者服务。可以使用XUnit、NUnit或MSTest项目创建此项目。

2)集成测试项目
集成测试是测试类库或组件是否能在一起工作。可以使用XUnit、NUnit或MSTest项目创建此项目。

现在,我们已经完成整洁架构的整体介绍,是时候编码实现了。

3.2 构建整洁架构解决方案

本小节将通过代码落地一个基于整洁架构的物联网解决方案。该项目的目标是适用大部分物联网场景,管理员可以在其中添加、删除、更新和读取物模型。
本视频的所有命令行都可以在我的博客上获得,不想敲命令的同学可以自行获取。
开始之前,请先打开终端并导航到项目文件的目录中。
我这里使用的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 srcmkdir 1.coremkdir 2.infrastructuremkdir 3.presentation

2)创建core文件夹
一级目录和文件夹创建完成后,我们进入core文件夹:
cd 1.core
在core目录中,我们将创建两个项目Iot.Domain和Iot.Application:

dotnet new classlib -f net6.0 --name Iot.Domaindotnet new classlib -f net6.0 --name Iot.Application
以上两个项目都是基于.NET 6.0,现在进入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.Datadotnet 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.csprojdotnet 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.WebApicd Iot.WebApi

创建对Iot.Application和Iot.Data的依赖

dotnet add reference ../../1.core/Iot.Application/Iot.Application.csprojdotnet 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.csprojdotnet sln add src/1.core/Iot.Application/Iot.Application.csprojdotnet sln add src/2.infrastructure/Iot.Data/Iot.Data.csprojdotnet sln add src/2.infrastructure/Iot.Shared/Iot.Shared.csprojdotnet sln add src/3.presentation/Iot.WebApi/Iot.WebApi.csproj

至此,我们已经通过.NET CLI完成了我们解决方案的实现,接下来我们关闭终端并使用Visual Studio 2022打开我们的解决方案,如下图所示:

整洁架构的解决方案示意图:
a37ccf116be38d8b90501df885ac5dac.png

3.3本节总结

通过本节的学习,我们了解了什么是整洁架构,整洁架构的模块内容以及依赖关心,以及它将如何帮助开发人员构建可扩展、可演化、可测试的应用程序,比如为将来从单体向微服务演化打下一定的基础。
另外,我们还学习了如何在整洁架构中构造测试,最后,如何通过dotnet CLI构建ASP.NET Core的解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283128.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大并发数据队列

图解#include<stdio.h>#include<stdlib.h>#include<memory.h>#define N 100#define mytype intstruct MyQueue{mytype data[N];//数组存储队列int front;//拉屎int rear;//吃东西};typedef struct MyQueue myQ;//初始化void init(myQ *p){p->front p->…

总在用户态调试 C# 程序,终还是搭了一个内核态环境

一&#xff1a;背景 一直在用 WinDbg 调试用户态程序&#xff0c;并没有用它调试过 内核态&#xff0c;毕竟不是做驱动开发&#xff0c;也没有在分析 dump 中需要接触用内核态的需求&#xff0c;但未知的事情总觉得很酷&#xff0c;加上最近在看 《深入解析 Windows 操作系统》…

bat kafka启动_windows下搭建Kafka,并通过命令窗口收发消息

参考网址&#xff1a;前提条件&#xff1a;windows环境需要安装jdk2.由于Kafka依赖于zookeeper&#xff0c;所以也需要下载zookeeper,可以通过官网下载http://zookeeper.apache.org/3.安装zookeeper将压缩包解压后&#xff0c;到bin目录下&#xff0c;启动zkServer.bat即可注意…

异常处理、socke基于TCP协议编程

一、异常处理 1、错误和异常 1.程序中难免出现错误&#xff0c;而错误分成两种 &#xff08;1&#xff09;语法错误&#xff08;这种错误过不了Python解释器的语法检测&#xff0c;必须在程序执行前改正&#xff09; #语法错误示范一 if#语法错误示范二 def test:pass#语法错误…

windows下apache报错The requested operation has failed解决方法

2019独角兽企业重金招聘Python工程师标准>>> Apache报错The requested operation has failed&#xff0c;基本上是因为端口被占用。解决方法如下&#xff1a; 第一步&#xff0c;运行cmd&#xff0c;cd 定位到Apache安装目录的bin目录下&#xff0c;输入httpd.exe -…

stm32 usmart使用

我直接用正点原子给的&#xff0c;步骤如下 先添加三个.c进工程&#xff0c;添加两个头文件的编译路径 #include "usart.h"#include "usmart.h" main函数里添加如下 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2 uart_init(960…

Istio 1.15 发布,支持 arm64 架构处理器

Istio 是基于容器的云原生技术栈的三大核心技术之一&#xff0c;另外两个是 Kubernetes 和 Knative。其中 Kubernetes 和 Knative 早已支持了 arm64 架构&#xff0c;甚至连 Istio 的数据平面 Envoy 早在 1.16 版本 [1] 就已支持 arm64 架构&#xff08;2020 年 10 月&#xff…

TP框架表单验证 【包含ajax方法】

之前的表单验证都是用js写的&#xff0c;这里也可以使用tp框架的验证。但是两者比较而言还是js验证比较好&#xff0c;因为tp框架验证会运行后台代码&#xff0c;这样运行速度和效率就会下降。  自动验证是ThinkPHP模型层提供的一种数据验证方法&#xff0c;可以在使用create创…

Spring 入门学习二之IOC

今天来学习Spring ioc .一、spring jar 包导入 在 spring 官网下载开发包 spring-framework-4.2.4.RELEASE,然后导入需要的 jar 包到项目 /lib/ 目录下。 &#xfffc; 二、代码开发 新建一个 src/cn/sxt/bean/Hello.java文件 package cn.sxt.bean;/*** Created by kaiyiwang o…

java 物理内存_聊聊Java中的内存

JVM的内存先放一张JVM的内存划分图&#xff0c;总体上可以分为堆和非堆(粗略划分&#xff0c;基于java8)那么一个Java进程最大占用的物理内存为&#xff1a;Max Memory eden survivor old String Constant Pool Code cache compressed class space Metaspace Thread st…

.Net CoreRabbitMQ基本使用

队列模式https://www.rabbitmq.com/getstarted.html对以上几种模式进行简要分类&#xff0c;可以分成如下三类(RPC暂不考虑)简单队列模式&#xff0c;单发单收&#xff0c;一对一模式Worker模式&#xff0c;单发多收(一个消息一个接收者&#xff0c;多个消息多个接收者)&#x…

Linux包系列的知识(附:Ubuntu16.04升级到18.04的案例)

Linux基础&#xff1a;https://www.cnblogs.com/dunitian/p/4822808.html#linux 之前看到朋友还动不动 apt-get update upgrade&#xff0c;就很纳闷&#xff0c;后来发现原来他只是知道这个更新命令却不知其意&#xff0c;所以每次安装个包就把所有apt-get的常用清除更新命令打…

java获取tomcat目录结构_Tomcat目录结构详解

Tomcat目录结构图如下&#xff1a;bin目录存放一些可执行的二进制文件&#xff0c;.sh结尾的为linux下执行命令&#xff0c;.bat结尾的为windows下执行命令。catalina.sh&#xff1a;真正启动tomcat文件&#xff0c;可以在里面设置jvm参数。startup.sh&#xff1a;启动tomcat(需…

智慧农业物联网云平台方案

2019独角兽企业重金招聘Python工程师标准>>> 多比智慧农业物联网云平台解决方案结合了最先进的物联网、云计算、传感器、自动控制等, 在浏览器或手机客户端实时显示大棚、大田、温室等温度、湿度、PH值、光强度、CO2&#xff0c;或作为自动控制的参变量参与到自动控…

使用JDBC获取Oracle连接时报错

The Network Adapter could not establish the connection 网络适配器不能创建连接 作为初学者的来说&#xff0c;这个问题让我找了好多次&#xff0c;每次重新开启电脑时就可以正常获取连接&#xff0c;过了一会儿&#xff0c;自己不知道做了什么就会又报错&#xff0c;…

.Net CoreRabbitMQ消息转发可靠机制(上)

前言生产者发送消息到了队列&#xff0c;队列推送数据给了消费者&#xff0c;这里存在一些问题需要思考下生产者如何确保消息一定投递到了队列中RabbitMQ 丢失了消息(下文暂不涉及这块)队列如何确保消费者收到了消息呢生产者可靠发送执行流程当生产者将消息发送出去后&#xff…

一个java文件中可包含多个main方法

java中的main方法是java应用程序的入口&#xff0c;java程序在运行时&#xff0c;首先调用执行main方法。但并不是说java中只能有一个main方法&#xff0c;不同类中都可以包含main方法。当JVM进行编译时&#xff0c;会提示选择其中一个main方法作为编译的入口。 转载于:https:/…

【SRM-05 B】无题?

Description 有一个拥有n个城市的国家。这个国家由n-1条边连接起来。有一天国家发生叛乱。叛军已占领了一些城市。如果叛军占领的城市中&#xff0c;存在两个城市之间有边直接相连&#xff0c;则称这种情况是坏的。现在并不知道叛军占领了那些城市&#xff0c;问有多少种情况是…

分享一些 Java 后端的个人干货

学习 Java 也有了不少时间&#xff0c;入 Java 后台的坑也有了一段时日。这段时间里&#xff0c;听过许多前辈的经验与分享&#xff0c;也看过许多大佬的文章和作品。找了个时间整理和总结了一下我个人到目前为止一路以来的听到看到或者自己感悟到的干货。 这篇文章可能更多的是…

.NET MAUI实战 Routing

1.详情本章继续分享.NET MAUI中的路由&#xff0c;这个概念依旧是在Prism里存在过的概念。如果使用过Prism框架的小伙伴使用该机制上手速度是非常快的。接下来一起来看看什么是路由。.NET 多平台应用 UI (.NET MAUI) Shell 包含基于 URI 的导航体验&#xff0c;该体验使用路由导…