.net core后端框架 实战1-Web后端框架的组成

.NET后端框架1-Web后端框架的组成

1. .NET开发Web后端的核心优势

项目背景

基于项目需求,我们要开发一套数据监控查询系统,简称为“Q系统”。功能包含用户登录、权限管理、数据监控、数据查询、图表分析等。
前端使用vue框架;后端开发使用公司一直沿用的C#语言,使用NET8框架进行开发;在数据库上使用mysql8.4.4社区版
基于此项目,大概总结下使用NET进行web项目后端开发。

NET进行后端开发的优点

  1. 跨平台与高性能
    .NET 8基于Kestrel服务器(Libuv跨平台异步I/O库)实现高吞吐,同时支持Linux容器化部署。目前我们涉及不到Linux,仅做预留项吧。
  2. 中间件管道模式
    基于Microsoft.AspNetCore.Builder的管道配置(如UseRouting()UseAuthentication()),还支持自定义中间件处理链路和请求。
  3. 依赖注入系统
    NET8自带的控制翻转容器,对系统服务、自定义服务进行统一管理,根据场景提供不同生命周期的服务(Singleton/Scoped/Transient),各个场景采用依赖注入调用服务。
  4. 生态融合
    NET生态融合支持多范式数据访问,兼容Entity Framework Core(LINQ表达式树编译优化)、SQLSugar(动态Lambda编译+二级缓存机制)、Dapper(高性能ORM),同时通过统一服务层集成gRPC/GraphQL等协议。
    在本项目中我们使用SqlSugar。

项目验证

"Q系统"采用分层架构,数据处理流程如下:

前端请求 → JWT Bearer认证 → 日志及异常处理中间件 → 动态路由 → 控制器验证 → 领域服务(CQRS模式) → ORM数据访问 → Redis二级缓存 → 统一响应包装

2. 客户端请求链路解析

客户端 ASP.NET Core管道 路由系统 控制器 业务层 数据层 数据库 POST/GET /api/users (JWT in Header;Param in Body) 异常处理中间件(Try/Catch全局拦截) 日志记录中间件(记录请求日志) 静态文件中间件(检查wwwroot匹配) 认证中间件(JWT解密→ClaimsPrincipal) 进入Endpoint路由 匹配[HttpPost("users")] Action 模型绑定(JSON→UserDTO) 数据注解验证([Required]检查) 过滤器执行([Authorize]权限拦截) _userService.Create(dto) _userRepo.AddAsync(entity) DbContext.SaveChanges()(生成INSERT SQL) 返回新用户ID 返回领域对象 业务结果 IActionResult 结果过滤器(统一包装为ApiResult) 返回201 Created 客户端 ASP.NET Core管道 路由系统 控制器 业务层 数据层 数据库

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)接收请求、调用业务逻辑、返回响应MVCREST APIMinimal API
业务逻辑层 (Services)实现核心业务规则,如订单处理、用户管理领域模型、CQRSMediatR
数据访问层 (DAL)与数据库交互,封装 CRUD 操作Entity Framework CoreDapperSqlsuager
基础设施层提供通用能力:日志、缓存、消息队列、认证授权SerilogRedisJWTIdentity
配置与依赖注入管理应用配置和组件生命周期IConfigurationIServiceCollection

核心组件技术选型:

模块技术选型性能考量
ORMSqlsugar批量操作用ExecuteDeleteAsync
缓存Redis(分布式)使用StackExchange.Redis连接复用
MemoryCache(进程内)设置滑动过期时间
日志Serilog + Elasticsearch结构化日志模板
监控OpenTelemetry + Prometheus自定义Metrics跟踪业务指标
文档Swagger/NSwag启用JWT授权标注

5. 分层交互关系(增加图示)

依赖
依赖
依赖
实现
被所有层引用
包含
包含
API Controllers
Application Services
Domain Models
Repositories
DbContext
Common
Filters
Middleware

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值