用途:为 .NET 8 后端服务提供一套有主见的架构约定,适用于构建或评审服务结构。语言层面的约定另见 csharp 技能。
分层:依赖只向内。Domain 不依赖任何其他层;只有 Infrastructure 可引用数据库或 SDK。 Domain:实体、值对象、领域事件、接口,无依赖。 Application:用例、CQRS 处理程序、DTO、验证器,依赖 Domain。 Infrastructure:EF Core、外部 API、Domain 接口实现,依赖 Domain + Application。 Api:端点、DI 装配、中间件,依赖以上全部。 判断边界是否完整:若 Domain 除 BCL 外无包引用仍可编译即可。
实体自行维护不变式:私有 setter、供 EF Core 物化用的私有无参构造,以及会校验的静态工厂。公开 setter 会让任何层把实体置于非法状态。
约定:读写在模型、一致性、扩展性上确有差异时用 MediatR 的 CQRS;CRUD 服务上属仪式性代码,应按领域需要采用而非默认启用。横切关注点放在管道行为中而非处理程序里,验证、日志、事务写一次即适用所有处理程序。Minimal API 用 MapGroup 分组,按功能区分文件。验证放在 Application 边界(行为中的 FluentValidation),端点内验证只守护 HTTP。DbContext 留在 Infrastructure,置于 Application 层拥有的接口之后。密钥不写入 appsettings.json,本地用 user-secrets,生产用环境变量或保险库。从一开始就加健康检查(/health/live、/health/ready)和带关联 ID 的结构化日志:就绪可检查数据库和下游 API,存活只检查进程本身。容器以非 root 用户运行,加一行 USER。用 WebApplicationFactory 配真实数据库(Testcontainers)做集成测试。仅在启动时间或体积确有必要时使用 AOT,它排除运行时反射,需先验证整个技术栈可承受。