.NET后端框架1-Web后端框架的组成
1. .NET开发Web后端的核心优势
项目背景
基于项目需求,我们要开发一套数据监控查询系统,简称为“Q系统”。功能包含用户登录、权限管理、数据监控、数据查询、图表分析等。
前端使用vue框架;后端开发使用公司一直沿用的C#语言,使用NET8框架进行开发;在数据库上使用mysql8.4.4社区版
基于此项目,大概总结下使用NET进行web项目后端开发。
NET进行后端开发的优点
- 跨平台与高性能
.NET 8基于Kestrel服务器(Libuv跨平台异步I/O库)实现高吞吐,同时支持Linux容器化部署。目前我们涉及不到Linux,仅做预留项吧。 - 中间件管道模式
基于Microsoft.AspNetCore.Builder
的管道配置(如UseRouting()
、UseAuthentication()
),还支持自定义中间件处理链路和请求。 - 依赖注入系统
NET8自带的控制翻转容器,对系统服务、自定义服务进行统一管理,根据场景提供不同生命周期的服务(Singleton/Scoped/Transient),各个场景采用依赖注入调用服务。 - 生态融合
NET生态融合支持多范式数据访问,兼容Entity Framework Core(LINQ表达式树编译优化)、SQLSugar(动态Lambda编译+二级缓存机制)、Dapper(高性能ORM),同时通过统一服务层集成gRPC/GraphQL等协议。
在本项目中我们使用SqlSugar。
项目验证
"Q系统"采用分层架构,数据处理流程如下:
前端请求 → JWT Bearer认证 → 日志及异常处理中间件 → 动态路由 → 控制器验证 → 领域服务(CQRS模式) → ORM数据访问 → Redis二级缓存 → 统一响应包装
2. 客户端请求链路解析
3. 程序分层架构演进
程序采用 传统三层架构 ,数据、业务、表现层独立封装,采用接口和依赖注入进行耦合处理。
分层模式对比
分层 | 传统三层架构 | 领域驱动设计(DDD) | 清洁架构 |
---|---|---|---|
核心思想 | 数据-业务-表现分离 | 业务逻辑领域化 | 依赖倒置 |
适用场景 | CRUD类简单系统 | 复杂业务规则系统 | 长期演进的中大型系统 |
项目选择 | "Q系统"采用分层架构 | 预留领域事件、聚合根扩展 | 接口驱动依赖注入 |
核心层详解
1. 表现层 (API)
负责接收 HTTP 请求、路由绑定、参数验证和响应返回保证,需保持简洁,仅处理路由和输入输出逻辑
[ApiController]
[Route("api/[controller]")]
public class UsersController : ControllerBase
{
private readonly IUserService _service;
// 构造函数注入
public UsersController(IUserService service) => _service = service;
[HttpPost]
[Authorize(Policy = "CreateUser")]
public async Task<ActionResult<UserResponse>> Create(UserCreateDto dto)
{
var result = await _service.CreateAsync(dto);
return CreatedAtAction(nameof(GetById), new { id = result.Id }, result);
}
}
2. 业务层 (Services)
核心业务逻辑实现,避免与数据访问、基础设施层的紧耦合,通过依赖注入(DI)解耦组件
public class UserService : IUserService
{
private readonly IUserRepository _repo;
private readonly ICacheService _cache;
public UserService(IUserRepository repo, ICacheService cache)
{
_repo = repo;
_cache = cache;
}
public async Task<UserResult> CreateAsync(UserCreateDto dto)
{
var user = new User(dto.Name, dto.Email); // 领域对象构造
if (await _repo.ExistsAsync(user.Email))
throw new ConflictException("Email已存在");
await _repo.AddAsync(user);
await _cache.RemoveAsync("all_users");
return user.ToResult();
}
}
3. 数据仓储层 (Repository)
数据库数据访问,搭配sqlsugar,为业务层访问数据库提供定义
public interface IUserRepository<T>
{
Task<T> GetByIdAsync(int id);
Task AddAsync(T entity);
}
// EF Core实现
public class EfUserRepository : IRepository<User>
{
private readonly AppDbContext _context;
public EfUserRepository(AppDbContext context) => _context = context;
// 实现接口方法...
}
4. 技术组件与选型
包含核心框架(如ASP.NET Core)、服务注入、配置系统、路由、中间件、控制器、模型、数据访问层、认证授权、日志监控、系统缓存、静态资源管理等。
各个模型及常用的组件如下表:
模块 | 作用 | 常用技术/组件 |
---|---|---|
HTTP 请求处理管道 | 处理请求/响应的全局逻辑,包含中间件、路由等 | ASP.NET Core 中间件、Endpoint Routing |
控制器层 (Controllers) | 接收请求、调用业务逻辑、返回响应 | MVC 、REST API 、Minimal API |
业务逻辑层 (Services) | 实现核心业务规则,如订单处理、用户管理 | 领域模型、CQRS 、MediatR |
数据访问层 (DAL) | 与数据库交互,封装 CRUD 操作 | Entity Framework Core 、Dapper 、Sqlsuager |
基础设施层 | 提供通用能力:日志、缓存、消息队列、认证授权 | Serilog 、Redis 、JWT 、Identity |
配置与依赖注入 | 管理应用配置和组件生命周期 | IConfiguration 、IServiceCollection |
核心组件技术选型:
模块 | 技术选型 | 性能考量 |
---|---|---|
ORM | Sqlsugar | 批量操作用ExecuteDeleteAsync |
缓存 | Redis(分布式) | 使用StackExchange.Redis连接复用 |
MemoryCache(进程内) | 设置滑动过期时间 | |
日志 | Serilog + Elasticsearch | 结构化日志模板 |
监控 | OpenTelemetry + Prometheus | 自定义Metrics跟踪业务指标 |
文档 | Swagger/NSwag | 启用JWT授权标注 |