在实际企业级开发中,.NET 平台因其成熟的生态、稳定的性能和丰富的工具链,成为构建高可用后端服务的优选方案。但很多初学者在环境配置、项目结构设计和部署上线环节容易遇到版本冲突、依赖管理混乱、配置缺失等问题。本文将围绕一个完整的订单管理系统开发流程,从环境准备开始,逐步实现用户认证、数据持久化、API 设计、异常处理到生产部署,帮助读者建立可复用的工程化开发习惯。
1. 环境准备与工具链配置
1.1 选择适合长期维护的开发环境
虽然 Visual Studio 提供了完整的 .NET 开发体验,但在团队协作和持续集成场景下,更推荐使用 VS Code + 命令行工具的组合。这种组合能让你更清楚每个操作背后的实际命令,便于后续编写自动化脚本。
首先确认操作系统版本和架构:
# Windows 用户查看系统信息 eer systeminfo | findstr /B /C:"OS 名称" /C:"OS 版本" # macOS/Linux 用户查看系统信息 uname -a根据系统类型下载安装 .NET SDK(建议选择长期支持版本):
- Windows x64:下载 .NET 8.0 SDK 安装包
- macOS ARM64:使用 Homebrew 安装
brew install --cask dotnet-sdk - Linux Ubuntu:按照微软官方文档添加包源后安装
验证安装是否成功:
dotnet --version # 预期输出:8.0.100 或更高版本 dotnet --list-sdks # 查看所有已安装的 SDK 版本1.2 配置开发工具和必要插件
在 VS Code 中安装以下核心扩展:
- C# Dev Kit:提供项目管理、测试运行器和调试支持
- C#:语言智能提示和语法高亮
- .NET Extension Pack:包含常用 .NET 开发工具
- NuGet Package Manager:可视化管理依赖包
创建全局 NuGet 配置避免每次手动添加源:
<!-- ~/.nuget/NuGet/NuGet.Config --> <?xml version="1.0" encoding="utf-8"?> <configuration> <packageSources> <add key="nuget.org" value="https://api.nuget.org/v3/index.json" /> <add key="company-internal" value="https://nuget.company.com/v3/index.json" /> </packageSources> </configuration>1.3 设置项目工作目录结构
企业级项目需要清晰的目录分离,避免后期维护混乱:
OrderManagementSystem/ ├── src/ │ ├── OrderManagement.API/ # Web API 项目 │ ├── OrderManagement.Core/ # 核心业务逻辑 │ ├── OrderManagement.Infrastructure/ # 数据访问和外部服务 │ └── OrderManagement.Shared/ # 公共模型和工具类 ├── tests/ │ ├── OrderManagement.API.Tests/ # API 集成测试 │ ├── OrderManagement.Core.Tests/ # 单元测试 │ └── TestHelpers/ # 测试辅助类 ├── scripts/ # 构建和部署脚本 ├── docs/ # 项目文档 └──pipeline/ # CI/CD 配置2. 创建领域模型和数据库设计
2.1 定义核心业务实体
从订单管理的核心需求出发,先设计领域模型。在OrderManagement.Core/Entities/目录下创建基础实体类:
// 基础实体抽象类 public abstract class BaseEntity { public int Id { get; set; } public DateTime CreatedAt { get; set; } = DateTime.UtcNow; public DateTime? UpdatedAt { get; set; } public bool IsDeleted { get; set; } } // 用户实体 public class User : BaseEntity { public string Username { get; set; } = string.Empty; public string Email { get; set; } = string.Empty; public string PasswordHash { get; set; } = string.Empty; public UserRole Role { get; set; } = UserRole.Customer; // 导航属性 public virtual ICollection<Order> Orders { get; set; } = new List<Order>(); } public enum UserRole { Customer, Admin, Manager }2.2 配置 Entity Framework Core 数据上下文
在 Infrastructure 项目中配置数据库上下文和实体映射:
// OrderManagement.Infrastructure/Data/ApplicationDbContext.cs public class ApplicationDbContext : DbContext { public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } public DbSet<User> Users => Set<User>(); public DbSet<Order> Orders => Set<Order>(); public DbSet<Product> Products => Set<Product>(); protected override void OnModelCreating(ModelBuilder modelBuilder) { // 配置软删除查询过滤器 modelBuilder.Entity<User>().HasQueryFilter(u => !u.IsDeleted); modelBuilder.Entity<Order>().HasQueryFilter(o => !o.IsDeleted); modelBuilder.Entity<Product>().HasQueryFilter(p => !p.IsDeleted); // 配置索引提升查询性能 modelBuilder.Entity<User>() .HasIndex(u => u.Email) .IsUnique(); modelBuilder.Entity<Order>() .HasIndex(o => new { o.UserId, o.CreatedAt }); } }2.3 数据库迁移和种子数据
创建初始迁移并添加必要的测试数据:
# 在 Infrastructure 项目目录下执行 dotnet ef migrations add InitialCreate --context ApplicationDbContext dotnet ef database update --context ApplicationDbContext配置开发环境种子数据:
// OrderManagement.Infrastructure/Data/SeedData.cs public static class SeedData { public static void Initialize(ApplicationDbContext context) { if (context.Users.Any()) return; // 避免重复种子数据 var users = new[] { new User { Username = "admin", Email = "admin@orders.com", Role = UserRole.Admin }, new User { Username = "manager", Email = "manager@orders.com", Role = UserRole.Manager } }; context.Users.AddRange(users); context.SaveChanges(); } }3. 实现分层架构和依赖注入
3.1 配置依赖注入容器
在 API 项目的 Program.cs 中注册所有必要的服务:
// OrderManagement.API/Program.cs var builder = WebApplication.CreateBuilder(args); // 数据库配置 builder.Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))); // 注册仓储和服务 builder.Services.AddScoped<IUserRepository, UserRepository>(); builder.Services.AddScoped<IOrderService, OrderService>(); builder.Services.AddScoped<IJwtService, JwtService>(); // 配置 JWT 认证 builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = builder.Configuration["Jwt:Issuer"], ValidAudience = builder配置["Jwt:Audience"], IssuerSigningKey = new SymmetricSecurityKey( Encoding.UTF8.GetBytes(builder.Configuration["Jwt:SecretKey"])) }; }); // 添加 Swagger 文档 builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "Order Management API", Version = "v1" }); }); var app = builder.Build();3.2 实现仓储模式和数据访问层
在 Infrastructure 项目中实现具体的仓储类:
// OrderManagement.Infrastructure/Repositories/UserRepository.cs public class UserRepository : IUserRepository { private readonly ApplicationDbContext _context; public UserRepository(ApplicationDbContext context) { _context = context; } public async Task<User?> GetByIdAsync(int id) { return await _context.Users .FirstOrDefaultAsync(u => u.Id == id && !u.IsDeleted); } public async Task<User?> GetByEmailAsync(string email) { return await _context.Users .FirstOrDefaultAsync(u => u.Email == email && !u.IsDeleted); } public async Task AddAsync(User user) { await _context.Users.AddAsync(user); await _context.SaveChangesAsync(); } public async Task UpdateAsync(User user) { user.UpdatedAt = DateTime.UtcNow; _context.Users.Update(user); await _context.SaveChangesAsync(); } public async Task DeleteAsync(int id) { var user = await GetByIdAsync(id); if (user != null) { user.IsDeleted = true; await UpdateAsync(user); } } }3.3 实现业务逻辑服务层
在 Core 项目中定义服务接口和实现:
// OrderManagement.Core/Interfaces/Services/IOrderService.cs public interface IOrderService { Task<OrderResult> CreateOrderAsync(CreateOrderRequest request); Task<OrderDetailResult> GetOrderDetailAsync(int orderId, int userId); Task<PagedResult<OrderSummary>> GetUserOrdersAsync(int userId, int page, int pageSize); } // OrderManagement.Core/Services/OrderService.cs public class OrderService : IOrderService { private readonly IOrderRepository _orderRepository; private readonly IProductRepository _productRepository; private readonly ILogger<OrderService> _logger; public OrderService(IOrderRepository orderRepository, IProductRepository productRepository, ILogger<OrderService> logger) { _orderRepository = orderRepository; _productRepository = productRepository; _logger = logger; } public async Task<OrderResult> CreateOrderAsync(CreateOrderRequest request) { // 验证产品是否存在和库存充足 var product = await _productRepository.GetByIdAsync(request.ProductId); if (product == null) { return OrderResult.Failure("产品不存在"); } if (product.StockQuantity < request.Quantity) { return OrderResult.Failure($"库存不足,当前库存:{product.StockQuantity}"); } // 创建订单 var order = new Order { UserId = request.UserId, TotalAmount = product.Price * request.Quantity, OrderItems = new List<OrderItem> { new OrderItem { ProductId = product.Id, Quantity = request.Quantity, UnitPrice = product.Price } } }; try { await _orderRepository.AddAsync(order); // 更新产品库存 product.StockQuantity -= request.Quantity; await _productRepository.UpdateAsync(product); _logger.LogInformation("订单创建成功,订单号:{OrderId}", order.Id); return OrderResult.Success(order.Id); } catch (Exception ex) { _logger.LogError(ex, "创建订单时发生错误"); return OrderResult.Failure("创建订单失败"); } } }4. 设计 RESTful API 和控制器
4.1 实现认证和授权控制器
创建用户认证相关的 API 端点:
// OrderManagement.API/Controllers/AuthController.cs [ApiController] [Route("api/[controller]")] public class AuthController : ControllerBase { private readonly IUserService _userService; private readonly IJwtService _jwtService; public AuthController(IUserService userService, IJwtService jwtService) { _userService = userService; _jwtService = jwtService; } [HttpPost("register")] public async Task<IActionResult> Register(RegisterRequest request) { var result = await _userService.RegisterAsync(request); if (!result.Success) { return BadRequest(new { errors = result.Errors }); } return Ok(new { message = "注册成功" }); } [HttpPost("login")] public async Task<IActionResult> Login(LoginRequest request) { var user = await _userService.ValidateCredentialsAsync(request.Email, request.Password); if (user == null) { return Unauthorized(new { error = "用户名或密码错误" }); } var token = _jwtService.GenerateToken(user); return Ok(new { token = token, user = new { id = user.Id, email = user.Email, role = user.Role } }); } }4.2 实现订单管理 API
创建需要认证的订单相关端点:
// OrderManagement.API/Controllers/OrdersController.cs [ApiController] [Route("api/[controller]")] [Authorize] public class OrdersController : ControllerBase { private readonly IOrderService _orderService; private readonly ILogger<OrdersController> _logger; public OrdersController(IOrderService orderService, ILogger<OrdersController> logger) { _orderService = orderService; _logger = logger; } [HttpPost] public async Task<IActionResult> CreateOrder(CreateOrderRequest request) { var userId = int.Parse(User.FindFirst(Claim