这是一个基于 .NET 9.0 的订单管理系统,采用六边形架构(Hexagonal Architecture)设计。
| 项目类型 | 目标框架 | 架构模式 | 编程语言 |
|---|---|---|---|
| ASP.NET Core Web API | .NET 9.0 | 六边形架构 | C# 12.0 |
职责: 程序入口点,依赖注入配置,中间件配置
技术栈:
- 依赖注入容器配置
职责: 处理HTTP请求,响应控制
技术栈:
- ASP.NET Core Controllers
- 模型验证与错误处理
- HTTP 适配器实现
职责: 核心业务逻辑,领域模型
技术栈:
- 纯C#实现,无外部框架依赖
- 领域驱动设计 (DDD)
- 值对象模式
- 实体模式
核心领域概念:
Order- 订单聚合根OrderItem- 订单项OrderId/OrderNumber- 订单标识值对象DeliveryInfo- 配送信息Pricing- 价格计算OrderStatus- 订单状态枚举
职责: 业务流程编排,用例实现
技术栈:
- 应用服务模式
- 端口适配器模式
- Command/Query 模式
- System.ComponentModel.DataAnnotations (验证)
核心组件:
CreateOrderService- 创建订单用例GetOrderService- 查询订单用例ISaveOrderPort/ILoadOrderPort- 端口接口OrderNotFoundException- 业务异常
职责: 外部依赖实现,技术服务
- 测试框架: MSTest 3.6.4
- Mock框架: Moq 4.20.72
- 断言库: FluentAssertions 7.0.0
- 测试SDK: Microsoft.NET.Test.Sdk 17.12.0
- 测试框架: MSTest + ASP.NET Core Test Framework
- 测试工具: Microsoft.AspNetCore.Mvc.Testing
- Nullable Reference Types (启用)
- Implicit Usings (启用)
- XML 文档注释
- 现代C#记录类型 (record types)
- 主构造函数 (primary constructors)
# 恢复依赖包
dotnet restore
# 编译整个解决方案
dotnet build运行所有测试:
# 运行所有测试项目
dotnet test运行特定测试项目:
# 单元测试
dotnet test DeveloperCodePairing.Tests.Unit
# 集成测试
dotnet test DeveloperCodePairing.Tests.Integration
# 运行测试并收集代码覆盖率
dotnet test --collect:"XPlat Code Coverage"开发环境启动:
# 信任 HTTPS 开发证书
dotnet dev-certs https --trust
# 启动开发服务器
dotnet run --project DeveloperCodePairing.Configuration
# 或者使用热重载模式
dotnet watch run --project DeveloperCodePairing.Configuration服务启动后可通过以下地址访问:
- HTTP: http://localhost:5000
- HTTPS: https://localhost:7000
- Swagger UI: http://localhost:5000/swagger
所有API端点都需要JWT Bearer认证。在请求头中添加:
Authorization: Bearer <your-jwt-token>
端点: POST /api/v1/orders
请求示例:
curl -X POST "http://localhost:5000/api/v1/orders" \
-H "Authorization: Bearer <your-jwt-token>" \
-H "Content-Type: application/json" \
-d '{
"merchantId": "merchant-123",
"items": [
{
"dishId": "dish-001",
"dishName": "宫保鸡丁",
"quantity": 2,
"price": 28.50
},
{
"dishId": "dish-002",
"dishName": "麻婆豆腐",
"quantity": 1,
"price": 18.00
}
],
"deliveryInfo": {
"recipientName": "张三",
"recipientPhone": "13812345678",
"address": "北京市朝阳区某某街道123号"
},
"remark": "少辣,不要香菜"
}'响应示例:
{
"code": 0,
"message": "订单创建成功",
"data": {
"orderId": "order-uuid-123",
"orderNumber": "ORD20241210001",
"status": "Pending",
"pricing": {
"itemsTotal": 75.00,
"packagingFee": 2.00,
"deliveryFee": 5.00,
"finalAmount": 82.00
},
"createdAt": "2024-12-10T14:30:00Z"
}
}端点: GET /api/v1/orders/{orderId}
请求示例:
curl -X GET "http://localhost:5000/api/v1/orders/order-uuid-123" \
-H "Authorization: Bearer <your-jwt-token>"响应示例:
{
"code": 0,
"message": "订单获取成功",
"data": {
"orderId": "order-uuid-123",
"orderNumber": "ORD20241210001",
"userId": "user-456",
"merchantId": "merchant-123",
"items": [
{
"dishId": "dish-001",
"dishName": "宫保鸡丁",
"quantity": 2,
"price": 28.50
},
{
"dishId": "dish-002",
"dishName": "麻婆豆腐",
"quantity": 1,
"price": 18.00
}
],
"deliveryInfo": {
"recipientName": "张三",
"recipientPhone": "13812345678",
"address": "北京市朝阳区某某街道123号"
},
"remark": "少辣,不要香菜",
"status": "Pending",
"pricing": {
"itemsTotal": 75.00,
"packagingFee": 2.00,
"deliveryFee": 5.00,
"finalAmount": 82.00
},
"createdAt": "2024-12-10T14:30:00Z"
}
}{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "Bad Request",
"status": 400,
"detail": "请求参数验证失败",
"errors": {
"MerchantId": ["商家ID不能为空"],
"Items": ["订单至少包含一个餐品"]
}
}