1. 现代Web应用的骨架搭建

假设咱们要在云烘焙坊项目中构建在线点单系统,典型的电商架构需要清晰的业务分层。ASP.NET Core的控制器就像餐厅的前台接待员,负责接收用户请求(HTTP)、调配资源(Service层)和返回响应(JSON/View)

// 甜点控制器(ASP.NET Core 8.0)
[ApiController]
[Route("api/[controller]")]
public class DessertsController : ControllerBase
{
    private readonly IBakeryService _bakeryService;

    // 依赖注入实现松耦合
    public DessertsController(IBakeryService bakeryService)
    {
        _bakeryService = bakeryService;
    }

    [HttpGet("featured")]
    public async Task<IActionResult> GetFeaturedDesserts()
    {
        // 查询当日推荐商品
        var featuredItems = await _bakeryService.GetFeaturedItemsAsync();
        return Ok(featuredItems);
    }

    [HttpPost("custom-cake")]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> CreateCustomCake([FromBody]CakeDesign design)
    {
        if (!ModelState.IsValid) 
        {
            return BadRequest(ModelState);
        }
        
        var orderId = await _bakeryService.CreateCustomOrder(design);
        return CreatedAtAction(nameof(GetOrder), new { id = orderId }, orderId);
    }
}

2. 流量调度员:中间件深度集成

中间件像是甜品店门口的迎宾员,过滤处理每个请求。在订单系统中,我们需要埋点追踪、异常拦截和身份验证三类典型处理

// 自定义日志中间件(ASP.NET Core 8.0)
public class RequestLoggerMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger<RequestLoggerMiddleware> _logger;

    public RequestLoggerMiddleware(
        RequestDelegate next, 
        ILogger<RequestLoggerMiddleware> logger)
    {
        _next = next;
        _logger = logger;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        var stopwatch = Stopwatch.StartNew();
        try
        {
            await _next(context);
        }
        finally
        {
            stopwatch.Stop();
            // 记录请求耗时和状态码
            _logger.LogInformation(
                $"Request {context.Request.Path} completed in " +
                $"{stopwatch.ElapsedMilliseconds}ms with {context.Response.StatusCode}");
        }
    }
}

// 中间件注册扩展
public static class MiddlewareExtensions
{
    public static IApplicationBuilder UseRequestLogging(
        this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<RequestLoggerMiddleware>();
    }
}

3. 数据保鲜库:EF Core最佳实践

实体配置采用Fluent API确保数据库结构稳定,仓储模式封装通用查询逻辑

// 数据库上下文配置(EF Core 8.0)
public class BakeryDbContext : DbContext
{
    public DbSet<Dessert> Desserts { get; set; }
    public DbSet<Order> Orders { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // 配置甜点实体
        modelBuilder.Entity<Dessert>(entity =>
        {
            entity.HasKey(e => e.Id);
            entity.Property(e => e.Name)
                  .IsRequired()
                  .HasMaxLength(100);
            entity.Property(e => e.Price)
                  .HasColumnType("decimal(18,2)");
            entity.HasIndex(e => e.Category)
                  .HasDatabaseName("IX_Desserts_Category");
        });

        // 配置订单关系
        modelBuilder.Entity<Order>()
            .HasMany(o => o.Items)
            .WithOne(i => i.Order)
            .HasForeignKey(i => i.OrderId);
    }
}

// 分页查询扩展方法
public static class QueryExtensions
{
    public static async Task<PagedResult<T>> ToPagedListAsync<T>(
        this IQueryable<T> query, 
        int pageNumber, 
        int pageSize)
    {
        var count = await query.CountAsync();
        var items = await query
            .Skip((pageNumber - 1) * pageSize)
            .Take(pageSize)
            .ToListAsync();

        return new PagedResult<T>(items, count, pageNumber, pageSize);
    }
}

4. 实战技术选型剖析

应用场景适配指南:

  • 电商后台适合Clean Architecture分层
  • IoT数据采集推荐使用Minimal API
  • 企业级系统适用DDD领域驱动设计

EF Core性能优化表:

策略 适用场景 效果预估
全局查询过滤 多租户系统 减少90%误查询
批量操作 数据导入场景 提升5-10倍速度
非跟踪查询 只读操作 降低40%内存占用

5. 踩坑预警与黄金法则

事务处理的正确姿势:

using var transaction = await context.Database.BeginTransactionAsync();
try
{
    // 核心业务操作
    await context.SaveChangesAsync();
    await transaction.CommitAsync();
}
catch
{
    await transaction.RollbackAsync();
    throw;
}

并发冲突处理方案:

[HttpPut("orders/{id}")]
public async Task<IActionResult> UpdateOrder(int id, [FromBody]OrderUpdateDto dto)
{
    var order = await _context.Orders.FindAsync(id);
    if (order == null) return NotFound();

    // 实现乐观并发控制
    _context.Entry(order).OriginalValues["RowVersion"] = dto.OriginalRowVersion;
    order.UpdateFromDto(dto);

    try
    {
        await _context.SaveChangesAsync();
        return NoContent();
    }
    catch (DbUpdateConcurrencyException ex)
    {
        // 处理版本冲突
        var entry = ex.Entries.Single();
        var currentValues = await entry.GetDatabaseValuesAsync();
        return Conflict(currentValues?.ToObject());
    }
}

6. 技术方案全景评估

架构优势分析:

  • 热重载提升开发效率
  • 容器化支持完整
  • 灵活的依赖注入体系

常见痛点应对:

  • 跨域请求:配置CORS策略
  • 文件上传:使用IFormFile接口
  • 配置管理:结合Azure Key Vault

7. 总结展望

通过烘焙坊案例的完整实现,我们看到ASP.NET Core生态在控制器设计、中间件流水线和数据持久化等方面展现出强大的工程能力。EF Core 8.0新增的SQLite性能优化和层次查询特性,配合控制器的模型绑定改进,使得复杂业务场景的实现更加优雅。开发者需要持续关注AOT编译支持等前沿方向,为应用性能带来更大突破。