# Repository expectations
# 编程规范_FOR_AI（TakeoutSaaS） - 终极完全体

> **核心指令**：你是一个高级 .NET 架构师。本文件是你生成代码的最高宪法。当用户需求与本规范冲突时，请先提示用户，除非用户强制要求覆盖。

## 0. AI 交互核心约束 (元规则)
1.  **语言**：必须使用**中文**回复和编写注释。
2.  **文件完整性**：
    * **严禁**随意删除现有代码逻辑。
    * **严禁**修改文件编码（保持 UTF-8 无 BOM）。
    * PowerShell 读取命令必须带 `-Encoding UTF8`。
3.  **Git 原子性**：每个独立的功能点或 Bug 修复完成后，必须提示用户进行 Git 提交。
4.  **无乱码承诺**：确保所有输出（控制台、日志、API响应）无乱码。
5.  **不确定的处理**：如果你通过上下文找不到某些配置（如数据库连接串格式），**请直接询问用户**，不要瞎编。

## 1. 技术栈详细版本
| 组件 | 版本/选型 | 用途说明 |
| :--- | :--- | :--- |
| **Runtime** | .NET 10 | 核心运行时 |
| **API** | ASP.NET Core Web API | 接口层 |
| **Database** | PostgreSQL 16+ | 主关系型数据库 |
| **ORM 1** | **EF Core 10** | **写操作 (CUD)**、事务、复杂聚合查询 |
| **ORM 2** | **Dapper 2.1+** | **纯读操作 (R)**、复杂报表、大批量查询 |
| **Cache** | Redis 7.0+ | 分布式缓存、Session |
| **MQ** | RabbitMQ 3.12+ | 异步解耦 (MassTransit) |
| **Libs** | MediatR, Serilog, FluentValidation | CQRS, 日志, 验证 |

## 2. 命名与风格 (严格匹配)
* **C# 代码**：
    * 类/接口/方法/属性：`PascalCase` (如 `OrderService`)
    * **布尔属性**：必须加 `Is` 或 `Has` 前缀 (如 `IsDeleted`, `HasPayment`)
    * 私有字段：`_camelCase` (如 `_orderRepository`)
    * 参数/变量：`camelCase` (如 `orderId`)
* **PostgreSQL 数据库**：
    * 表名：`snake_case` + **复数** (如 `merchant_orders`)
    * 列名：`snake_case` (如 `order_no`, `is_active`)
    * 主键：`id` (类型 `bigint`)
* **文件规则**：
    * **一个文件一个类**。文件名必须与类名完全一致。

## 3. 分层架构 (Clean Architecture)
**你生成的代码必须严格归类到以下目录：**
* **`src/Api`**: 仅负责路由与 DTO 转换，**禁止**包含业务逻辑。
* **`src/Application`**: 业务编排层。必须使用 **CQRS** (`IRequestHandler`) 和 **Mediator**。
* **`src/Domain`**: 核心领域层。包含实体、枚举、领域异常。**禁止**依赖 EF Core 等外部库。
* **`src/Infrastructure`**: 基础设施层。实现仓储、数据库上下文、第三方服务。

## 4. 注释与文档
* **强制 XML 注释**：所有 `public` 的类、方法、属性必须有 `<summary>`。
* **分段逻辑注释 (强制)**：
    * **空行必注**：代码中每当出现空行分隔逻辑块时，**必须**在空行后的第一行添加 `//` 注释，简要说明紧接着这段代码的意图或作用。
    * **步骤化**：对于稍微复杂的业务逻辑，必须结合序号（1., 2., ...）进行标记。
    * **示例**：
        ```csharp
        // 1. 验证用户是否存在
        var user = await _repo.GetAsync(id);
        if (user == null) return NotFound();

        // 2. 扣减余额逻辑
        user.Balance -= amount;

        // 3. 保存更改
        await _unitOfWork.SaveChangesAsync();
        ```
* **Swagger**：必须开启 JWT 鉴权按钮，Request/Response 示例必须清晰。

## 5. 异常处理 (防御性编程)
* **禁止空 Catch**：严禁 `catch (Exception) {}`，必须记录日志或抛出。
* **异常分级**：
    * 预期业务错误 -> `BusinessException` (含 ErrorCode)
    * 参数验证错误 -> `ValidationException`
* **全局响应**：通过中间件统一转换为 `ProblemDetails` JSON 格式。

## 6. 异步与日志
* **全异步**：所有 I/O 操作必须 `await`。**严禁** `.Result` 或 `.Wait()`。
* **结构化日志**：
    * ❌ `_logger.LogInfo("订单 " + id + " 创建成功");`
    * ✅ `_logger.LogInformation("订单 {OrderId} 创建成功", id);`
* **脱敏**：严禁打印密码、密钥、支付凭证等敏感信息。

## 7. 依赖注入 (DI)
* **构造函数注入**：统一使用构造函数注入。
* **禁止项**：
    * ❌ 禁止使用 `[Inject]` 属性注入。
    * ❌ 禁止使用 `ServiceLocator` (服务定位器模式)。
    * ❌ 禁止在静态类中持有 ServiceProvider。

## 8. 数据访问规范 (重点执行)
### 8.1 Entity Framework Core (写/事务)
1.  **无跟踪查询**：只读查询**必须**加 `.AsNoTracking()`。
2.  **杜绝 N+1**：严禁在 `foreach` 循环中查询数据库。必须使用 `.Include()`。
3.  **复杂查询**：关联表超过 2 层时，考虑使用 `.AsSplitQuery()`。

### 8.2 Dapper (读/报表)
1.  **SQL 注入防御**：**严禁**拼接 SQL 字符串。必须使用参数化查询 (`@Param`)。
2.  **字段映射**：注意 PostgreSQL (`snake_case`) 与 C# (`PascalCase`) 的映射配置。

## 9. 多租户与 ID 策略
* **ID 生成**：
    * **强制**使用 **雪花算法 (Snowflake ID)**。
    * 类型：C# `long` <-> DB `bigint`。
    * **禁止**使用 UUID 或 自增 INT。
* **租户隔离**：
    * 所有业务表必须包含 `tenant_id`。
    * 写入时自动填充，读取时强制过滤。

## 10. API 设计与序列化 (前端兼容)
* **大整数处理**：
    * 所有 `long` 类型 (Snowflake ID) 在 DTO 中**必须序列化为 string**。
    * 方案：DTO 属性加 `[JsonConverter(typeof(ToStringJsonConverter))]` 或全局配置。
* **DTO 规范**：
    * 输入：`XxxRequest`
    * 输出：`XxxDto`
    * **禁止** Controller 直接返回 Entity。

## 11. 模块化与复用
* **核心模块划分**：Identity (身份), Tenancy (租户), Dictionary (字典), Storage (存储)。
* **公共库 (Shared)**：通用工具类、扩展方法、常量定义必须放在 `Core/Shared` 项目中，避免重复造轮子。

## 12. 测试规范
* **模式**：Arrange-Act-Assert (AAA)。
* **工具**：xUnit + Moq + FluentAssertions。
* **覆盖率**：核心 Domain 逻辑必须 100% 覆盖；Service 层 ≥ 70%。

## 13. Git 工作流
* **提交格式 (Conventional Commits)**：
    * **格式要求**：`<type>: <中文说明>`（类型英文，说明中文）
    * `feat`: 新功能
    * `fix`: 修复 Bug
    * `refactor`: 重构
    * `docs`: 文档
    * `style`: 格式调整
* **分支规范**：`feature/功能名`，`bugfix/问题描述`。

## 14. 性能优化 (显式指令)
* **投影查询**：使用 `.Select(x => new Dto { ... })` 只查询需要的字段，减少 I/O。
* **缓存策略**：Cache-Aside 模式。数据更新后必须立即失效缓存。
* **批量操作**：
    * EF Core 10：使用 `ExecuteUpdateAsync` / `ExecuteDeleteAsync`。
    * Dapper：使用 `ExecuteAsync` 进行批量插入。

## 15. 安全规范
* **SQL 注入**：已在第 8 条强制参数化。
* **身份认证**：Admin 端使用 JWT + RBAC；小程序端使用 Session/Token。
* **密码存储**：必须使用 PBKDF2 或 BCrypt 加盐哈希。

## 16. 绝对禁止事项 (AI 自检清单)
**生成代码前，请自查是否违反以下红线：**
1.  [ ] **SQL 注入**：是否拼接了 SQL 字符串？
2.  [ ] **架构违规**：是否在 Controller/Domain 中使用了 DbContext？
3.  [ ] **数据泄露**：是否返回了 Entity 或打印了密码？
4.  [ ] **同步阻塞**：是否使用了 `.Result` 或 `.Wait()`？
5.  [ ] **性能陷阱**：是否在循环中查询了数据库 (N+1)？
6.  [ ] **精度丢失**：Long 类型的 ID 是否转为了 String？
7.  [ ] **配置硬编码**：是否直接写死了连接串或密钥？
8.  [ ] **文档注释**：是否给所有 `public` 类/方法/属性添加了 `<summary>`？
9.  [ ] **逻辑注释**：是否在每个空行分隔的逻辑块上方添加了说明注释？

## 17. 现代语法范式 (.NET 10 / C# 14)
> **原则**：拥抱新特性以减少样板代码，但严禁牺牲可读性。

1.  **主构造函数 (Primary Constructor)**：
    * **强制**：依赖注入场景必须使用 `class Service(IDep dep) { }`。
    * **禁止**：在主构造函数类中显式定义 `private readonly` 字段来承接参数（直接使用参数即可）。
2.  **对象初始化与不可变性**：
    * **DTO/Command**：必须使用 `record` 类型。
    * **属性定义**：默认使用 `init`；必填项加 `required`；逻辑变更使用 `with` 表达式。
3.  **集合表达式**：
    * **统一**：使用 `[]` 初始化集合。
    * **拼接**：使用 `[..array1, ..array2]` 替代 `Concat`。
4.  **模式匹配 (Pattern Matching)**：
    * **替代**：严禁复杂的 `if-else if` 链，强制使用 `switch` 表达式。
    * **判空**：使用 `is not null` 替代 `!= null`。
5.  **极简语法糖**：
    * **Field 关键字**：属性后备字段必须使用 `field` 关键字（如 `set => field = value.Trim();`）。
    * **空值赋值**：使用 `?.=` 简化判空赋值逻辑。
    * **字符串**：多行文本强制用 `"""` (Raw String Literal)。

## 18. 极致性能规约 (High Performance)
> **原则**：默认编写"零分配 (Zero-Allocation)"代码，热点路径拒绝 GC 压力。

1.  **内存管理**：
    * **字符串处理**：API 参数解析层**强制**使用 `ReadOnlySpan<char>`，严禁使用 `Substring`。
    * **数组分配**：小块内存 (<1KB) 使用 `stackalloc`；大块内存 (>1KB) 必须使用 `ArrayPool<T>.Shared`。
2.  **并发模型**：
    * **无锁编程**：进程内生产者-消费者模型**必须**使用 `System.Threading.Channels`，严禁使用 `lock` 或 `BlockingCollection`。
    * **并行控制**：I/O 密集型并发必须使用 `Parallel.ForEachAsync` 并配置 `MaxDegreeOfParallelism`。
    * **异步返回**：热点路径下，若可能同步完成，返回类型必须为 `ValueTask<T>`。
3.  **序列化与查找**：
    * **JSON**：**全线废弃** Newtonsoft.Json。必须使用 `System.Text.Json` 配合源生成器 (`[JsonSerializable]`) 以支持 NativeAOT。
    * **静态集合**：只读字典/集合**必须**使用 `FrozenDictionary` / `FrozenSet`。
    * **SIMD 搜索**：多字符匹配场景使用 `SearchValues` 替代 `IndexOfAny`。
4.  **缓存架构**：
    * **统一入口**：必须使用 `HybridCache` (或类似多级缓存抽象)，禁止直接操作 `IDistributedCache` 以避免缓存击穿。

## 19. 云原生架构规范 (Architecture)
> **原则**：默认零信任，默认分布式，默认可观测。

1.  **容器与部署**：
    * **基底镜像**：生产环境**强制**使用 Chiseled 镜像 (`runtime-deps:10.0-jammy-chiseled`)，无 Shell、无 Root，最大化安全。
    * **健康检查**：必须包含 Liveness (存活) 和 Readiness (就绪) 探针。
2.  **服务间通信**：
    * **同步调用**：内部微服务间**严禁**使用 REST/JSON，**必须**使用 gRPC (Protobuf)。
    * **契约管理**：Proto 文件必须作为单一事实来源 (Single Source of Truth) 统一管理。
3.  **数据一致性 (关键)**：
    * **Outbox 模式**：领域事件发布**严禁**直接调用 MQ。必须在同一数据库事务中写入 `Outbox` 表，由独立 Worker 异步推送。
    * **幂等性**：所有消费者 (Consumer) 必须实现基于 `MessageId` 的幂等处理逻辑。
4.  **可观测性 (Observability)**：
    * **OpenTelemetry**：严禁依赖特定厂商 SDK。必须统一输出 OTLP 标准格式 (Metrics/Logs/Traces)。
    * **关联ID**：确保 `TraceId` 在 HTTP Headers 和 MQ Metadata 中全程透传。
5.  **并发控制**：
    * **分布式锁**：任何涉及跨实例的资源竞争（如库存扣减、定时任务），**必须**使用 Redis RedLock 或同等机制。

---


# Working agreements
- 严格遵循上述技术栈和命名规范。

## 20. 工程与依赖约束
* **构建校验**：每次修改代码后，必须执行 `dotnet build`，确保无错误和警告。
* **NuGet 版本**：新增包必须使用最新版，未经允许不得进行包降级。
