.Net Core后端架构实战【1-项目分层框架设计】
摘要:基于.NET Core 7.0WebApi后端架构实战【1-项目结构分层设计】 2023/02/05, ASP.NET Core 7.0, VS2022
引言
从实习到现在回想自己已经入行四年了,很庆幸自己一直还是从事着开发的工作。这几年不管是工作还是生活都有很多不甘与失落还有
收获,从学校出来之后有时候觉得自己的心态受不了小小的打击,可能就像平凡的世界中的孙少平一样,有着一颗敏感而脆弱的自尊心。春
种一粒粟,秋收万颗子。从2021年1月份到现在一直没有更新过博客,在这个播种的季节我想我应该要总结一下过去的技术经验,对自己是提
升,对别人可能或多或少都有帮助。阿里巴巴大神毕玄曾说过,“一个优秀的工程师和一个普通工程师的区别,不是满天飞的架构图,他的功
底体现在所写的每一行代码上”。这句话我与诸君共思共勉!
分层目标
- 大道至简:能提高开发效率,让刚进公司的实习生也能快速上手CRUD
- 结构清晰:不仅要遵循DIP原则(降低耦合),而且也要保证每一层或每一个类库职责单一,减少后期维护成本
- 扩展/复用:分层之后有很高的复用性和更方便的横向扩展性
传统三层架构
传统的三层架构:表现层、业务逻辑层和数据访问层,如下图所示:

DDD四层架构
基于DDD的四层架构:用户接口层、应用层、领域层和基础设施层,如下图所示:

与传统的三层架构相比DDD的分层架构将业务逻辑层拆为了应用层与领域层

下方左图为传统四层架构,右图为依赖倒置后的四层架构。应用层与领域层提供接口,基础设施层提供实现。领域层不依赖任何一层,只专注与业务。个人认为基础设施层迭代频率要低于接口层,抽象程度高于表现层。所以让表现层依赖基础设施层更合适。

我的本系列博客对应的项目也是基于DDD的架构思想,当然也会加入自己的一些想法在其中。
想学习领域驱动设计的同学可移步《DDD 实战课》
项目结构
整体项目结构如下方三张图所示:



层级介绍
1.ICore.WebApi这一层主要构建 RESTful 应用程序,提供HTTP服务。管道中间件、过滤器、跨域、路由、模型验证等都在此配置。
2.ICore.Application这一层很薄,不会包含任何与业务有关的逻辑信息,将使用CQRS的设计模式。安全认证、权限校验、事务控制、发送或订阅领域事件等都可在此层做处理。
3.ICore.Task这一层主要用于处理系统内小型定时任务。繁多、复杂的定时任务建议用第三方调度平台,例如:XXL-JOB。
4.ICore.Domain.Core这一层主要用于实现核心的业务逻辑!内部主要包含Entity(实体)、Domain Event(领域事件)、Domain Service(领域服务)等。
5.ICore.Domain.Abstractions这一层主要用于定义一些基类的接口和领域事件的接口。例如:IAggregateRoot聚合根接口、IEntity、IEntity<TKey> 实体接口等。
6.ICore.Infrastructure.Core这一层主要对整个应用程序提供基础实现,例如仓储的实现、工作单元模式的实现、Redis缓存、队列服务等。
7.ICore.Test这一层主要用于对整个程序的单元测试,减少不必要的BUG以及提高测试效率。
其它规范
编码、格式规范
我强烈建议大家看阿里巴巴Java开发手册,以上面的规范来约束自己的编码。

配置文件规范
- 全部采用json格式文件
- 建立映射类,使用IOptions<T>方式读取配置信息
- 数据库连接字符串、数据传输的加密密钥等不建议写在配置文件中,应放到分布式配置中心中
安全规范(只列举部分)
- 加入恶意请求IP黑名单
- 防SQL注入攻击
- 日志应记录请求时间、操作人ID、IP地址、是否成功等重要信息
- CORS策略应加上白名单限制
- 生产环境的接口文档不对外暴露
启动项目
首先.Net Core同Spring Boot一样都是自宿主程序,其不是必需在IIS内部托管。实现跨平台离不开.Net Core内置的kestrel高性能服务器,如下图所示(图片来自官网):

修改端口
1、在launchSettings.json文件中修改站点信息,把IIS Express节点删掉

2、在appsettings.json中设置启动端口
"Kestrel": {
"Endpoints": {
"Https": {
"Url": "https://*:8000"
},
"Http": {
"Url": "http://*:8001"
}
}
}
3、在Program中设置启动端口

app.Run("http://*:8001");
加入Startup.cs
从.Net6.0开始已去除了Startup.cs 文件,依赖注入服务和Middleware全在Program.cs中配置。
我从写.Net Core2.0开始一直到现在,Startup.cs文件我觉得还是有必要存在,个人使用习惯而已
改造Program.cs
using ICore.WebApi;
var builder = WebApplication.CreateBuilder(args);
var startup = new Startup(builder.Configuration);
startup.ConfigureServices(builder.Services);
startup.Configure(builder.Build());
重写Startup.cs
namespace ICore.WebApi
{
public class Startup
{
public IConfiguration Configuration { get; }
public Startup(IConfiguration configuration) => Configuration = configuration;
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
services.AddEndpointsApiExplorer();
services.AddSwaggerGen();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(WebApplication app)
{
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseAuthorization();
app.MapControllers();
app.Run("http://*:8001");
}
}
}
Run起来!
使用命令行启动dotnet ICore.WebApi.dll --urls="http://*:8001" --ip="127.0.0.1" --port=8001


这一节就到这里,后面会继续上新!
.Net Core后端架构实战【1-项目分层框架设计】的更多相关文章
- 开箱即用~基于.NET Core的统一应用逻辑分层框架设计
目前公司系统多个应用分层结构各不相同,给运维和未来的开发带来了巨大的成本,分层架构看似很简单,但保证整个研发中心都使用统一的分层架构就不容易了. 那么如何保证整个研发中心都使用统一的分层架构,以达到提 ...
- 基于SpringCloud的微服务架构实战案例项目,以一个简单的购物流程为示例
QuickStart 基于SpringCloud体系实现,简单购物流程实现,满足基本功能:注册.登录.商品列表展示.商品详情展示.订单创建.详情查看.订单支付.库存更新等等. 每个业务服务采用独立的M ...
- 基于SpringCloud的微服务架构实战案例项目
QuickStart 基于SpringCloud体系实现,简单购物流程实现,满足基本功能:注册.登录.商品列表展示.商品详情展示.订单创建.详情查看.订单支付.库存更新等等. github源码地址:h ...
- 阶段4-独挡一面\项目-基于视频压缩的实时监控系统\Sprint1-基于Epoll架构的采集端程序框架设计\第2课-基于Epoll的采集端程序框架设计
回顾之前的整个程序架构 把epoll机制应用到这个架构上去 下面主要去分析我们的系统中有没有需要等待的事件,先看看采集子系统 在采集子系统当中,摄像头有数据,摄像头采集到图像数据可以作为一个等待事件. ...
- Asp.Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现
0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_2-4.后端项目分层分包及资源文件处理
笔记 4.后端项目分层分包及资源文件处理 简介:项目基本目录结构,包名称建立,配置文件建立 1.基本目录结构 controller se ...
- net core 中间件详解及项目实战
net core 中间件详解及项目实战 前言 在上篇文章主要介绍了DotNetCore项目状况,本篇文章是我们在开发自己的项目中实际使用的,比较贴合实际应用,算是对中间件的一个深入使用了,不是简单的H ...
- 项目实战7—Mysql实现企业级数据库主从复制架构实战
Mysql实现企业级数据库主从复制架构实战 环境背景:公司规模已经形成,用户数据已成为公司的核心命脉,一次老王一不小心把数据库文件删除,通过mysqldump备份策略恢复用了两个小时,在这两小时中,公 ...
- 架构师入门:搭建双注册中心的高可用Eureka架构(基于项目实战)
本文的案例是基于 架构师入门:搭建基本的Eureka架构(从项目里抽取) 改写的. 在上文里,我们演示Eureka客户端调用服务的整个流程,在这部分里我们将在架构上有所改进.大家可以想象下,在上文里案 ...
- ABP开发框架前后端开发系列---(3)框架的分层和文件组织
在前面随笔<ABP开发框架前后端开发系列---(2)框架的初步介绍>中,我介绍了ABP应用框架的项目组织情况,以及项目中领域层各个类代码组织,以便基于数据库应用的简化处理.本篇随笔进一步对 ...
随机推荐
- 1742C
题目链接 题目大意: 在一个8x8的方格中你每次可以将一行全部涂成红色或者将一列涂成蓝色.问最后一次操作是什么操作: 如果是行操作就输出R 如果是列操作就输出B 解题思路: 我们可一枚举每行每列,如果 ...
- HDLBits答案——Verification: Writing Testbenches
1 clock module top_module ( ); reg clk; dut U1(.clk(clk)); initial begin clk = 0; end always begin # ...
- Day17.1:静态与非静态的详解
静态与非静态 静态方法--类方法 是以static为关键词,从属于类,与类共生 public class Students{//class修饰的是一个类,所以这是一个学生类 public static ...
- python选课系统项目详解
选课系统项目详解 选课系统简介及分析 选课系统架构设计分析 选课系统目录设计 管理员视图 注册 登录 创建学校 创建课程 创建讲师 学生视图 注册 登录 选择学校 选择课程 查看分数 教师视图 登录 ...
- 聊聊如何让办公网络直连Kubernetes集群PodIP/ClusterIP/Service DNS等
想象一下,如果您日常使用的研发测试Kubernetes集群,能够有以下效果: 在办公网络下直接访问Pod IP 在办公网络下直接访问Service Cluster IP 在办公网络下直接访问集群内部域 ...
- IDEA git配置
必备:安装Idea \ git配置git坏境:在环境变量中添加git安装包bin目录即可 1.去git官网申请一个账号 https://github.com/ 创建一个新的项目 2.在快速启动栏或者g ...
- nginx压力测试及限速
测试工具:Apache ab windows安装教程:https://www.cnblogs.com/laijinquan/p/14694655.html 64位下载地址:https://www.ap ...
- Springboot优雅进行字段检验
Springboot优雅进行字段检验 1.Controller VS Service 推荐与业务无关的放在controller层中进行校验,而与业务相关的放在service层中校验. 2.常用校验工具 ...
- 单点登录系统使用Spring Security的权限功能
背景 在配置中心增加权限功能 目前配置中心已经包含了单点登录功能,可以通过统一页面进行登录,登录完会将用户写入用户表 RBAC的用户.角色.权限表CRUD.授权等都已经完成 希望不用用户再次登录,就可 ...
- 多进程TCP服务端并发- 进程join方法 - IPC机制
目录 同步与异步 阻塞与非阻塞 综合使用 创建进程的多种方式 进程间数据隔离 进程join方法 IPC机制 生产者消费者模型 进程对象的多种方法 僵尸进程与孤儿进程 守护进程 多线程实现TCP服务端并 ...