分布式系统的第一法则是不要过早进行分布式拆分。在过去十年的企业软件演进中,大量团队陷入了“微服务狂热(Microservices Hype)”:一个仅有十几人研发规模的系统被强行拆解成数十个独立服务,随之而来的是分布式事务崩溃、链路网络延迟不可控、跨服务版本断崖式失配以及指数级膨胀的 Kubernetes 基础设施维护成本。
然而,退回传统的“三层单体架构(Layered Monolith)”同样充满陷阱:控制器臃肿不堪、业务逻辑四散在各个 Service 内部、跨领域的直接数据库外键依赖横行无忌,最终软件在几年内迅速退化为不可维护的大泥球(Big Ball of Mud)。
BitzOrcas.Modern 旨在终结这种非此即彼的架构撕裂。作为面向 .NET 10 LTS 与 C# 14 构建的企业级模块化单体底座,它通过严格的物理边界治理(ArchUnitNET)、垂直切片架构(Vertical Slice)与零反射编译期生成器(Source Generators),在单一代码仓库和单一进程内同时实现单体架构的开发调试极速体验与微服务级别的强物理隔离。
核心架构拓扑全景
BitzOrcas.Modern 的系统分层自上而下严格遵循单向依赖,底层基础设施与编译期生成器共同为上层业务领域提供零反射运行时:
一次入站请求的完整生命周期(端到端时序)
在 BitzOrcas.Modern 中,任何写操作(Command)或复杂读操作(Query)均不直接在 Controller 或 Minimal API Lambda 中堆砌业务逻辑。请求被包装为强类型的 Mediator 请求后,必须顺次穿透由框架严格受控的 10 级线性执行管道:
核心架构原则与设计权衡
1. 垂直切片架构(Vertical Slice Architecture)
传统架构通常采用自上而下的横向技术分层:
Controllers/ ──> Services/ ──> Repositories/ ──> Entities/当团队需要为“律所利益冲突检索”新增一个校验字段时,开发者必须在 ConflictController、IConflictService、ConflictService、ConflictDto、ConflictMapper、ConflictEntity 之间来回跳跃,认知负荷极其沉重。
BitzOrcas 彻底颠覆这一模式,采用**“以业务用例为核心的垂直切片”**。每个业务切片独立内聚为一个独立的编译单元:
src/Platform/Identity/BitzOrcas.Identity.Application/Commands/Login/├── Login.cs # Minimal API 路由定义 + Mediator Command 契约├── LoginHandler.cs # 纯粹的业务领域编排逻辑├── LoginRequestRule.cs # 强类型不变量静态校验规则 (Tier 1)└── LoginResult.cs # 强类型返回模型 (无贫血包装)- 高内聚低耦合:业务变更仅限于单个切片目录,多人并行开发零 Git 冲突;
- 重构自愈:删除一个业务功能只需物理删除对应切片目录,不会在全工程留下难以清理的死代码残留。
2. 10 级应用执行管道(Mediator Pipeline Behaviors)
框架将所有企业级非功能性需求(Non-Functional Requirements)全部下沉至管道中由框架托管。各管道按严格的确定性顺序执行,保证业务 Handler 纯净无污染:
| 顺序 | 管道行为名称 | 职责定位 | 拦截短路语义 |
|---|---|---|---|
| 01 | LoggingPipelineBehavior | 关联 traceparent,统计管道执行耗时 | 始终放行,异常时记录完整上下文与调用堆栈 |
| 02 | RuntimeLicensePipelineBehavior | 校验商业证书有效期与租户席位授权 | 证书无效或过期直接阻断,响应 403 Forbidden |
| 03 | DelegatedSessionRestrictionPipelineBehavior | 审查运维或客服代入操作(Impersonation) | 发现越权写操作立即熔断,响应 403 Forbidden |
| 04 | AuthorizationPipelineBehavior | 统一 RBAC / ABAC / ReBAC 权限裁决 | 权限策略未满足立即阻断,响应 403 Forbidden |
| 05 | ValidationPipelineBehavior | 运行 IRequestRule 与租户动态策略 | 任一规则违背立即中断,响应 400 Bad Request |
| 06 | IdempotencyPipelineBehavior | 校验 Idempotency-Key,争抢 Redis 分布式锁 | 重复提交直接返回已缓存的历史计算结果 |
| 07 | TransactionPipelineBehavior | 自动开启数据库事务,确保原子提交 | 业务异常自动触发 Rollback,保证状态一致 |
| 08 | DomainEventDispatchPipelineBehavior | 聚合根领域事件分发与 CAP 发件箱落盘 | 与业务更新同一物理事务提交,保证至少一次投递 |
| 09 | ActivityAuditPipelineBehavior | 提取实体变更前/后 Diff,结构化审计落盘 | 事务成功后异步写入,不阻塞请求响应通道 |
| 10 | ReadModelDisplayPipelineBehavior | 针对 Query 查询结果执行字典与多语言充水 | 仅在查询管道生效,零反射高性能投影组装 |
3. 统一聚合根与编译期双 ORM 生成
在许多传统系统中,开发者被要求区分 DomainModel 与 DatabaseEntity,导致系统充斥着成百上千个毫无实际意义的 AutoMapper 映射配置。
在 BitzOrcas.Modern 中,对于 95% 的业务场景,领域聚合根即持久化模型(Unified Aggregate Root):
- 聚合根继承自
Entity<TId>或AggregateRoot<TId>,使用强类型 ID(如UserId、MatterId); - 通过标记中立的 Fluent 映射元数据,Roslyn 增量生成器(Incremental Source Generator)在编译期直接产出高性能的静态绑定逻辑;
- 双 ORM 生产级适配:支持 SqlSugar(默认主适配器)与 EF Core 并列运行,业务层完全基于
IEntitySet<TAggregate>进行抽象,永不泄漏具体 ORM 的底层类型。
跨模块协作硬性物理法则
为了防止单体项目在团队规模扩大后退化为纠缠不清的复杂网络,模块间交互必须严格遵守以下 5 项硬性物理法则:
- 契约单向依赖:模块 A 如需调用模块 B 的能力,只允许项目引用
B.Contracts,严禁直接引用B.Application、B.Domain或B.Infrastructure。 - 读操作走只读查询端口:跨模块同步数据获取必须通过目标模块在
*.Contracts中暴露的专用只读服务(如IUserLookupService),严禁跨模块直接注入对方的IEntitySet<T>。 - 写操作必须走命令分派或异步事件:跨模块的业务联动优先通过 CAP 事务性发件箱发布集成事件(Integration Event)完成最终一致性;同步写操作必须分派强类型 Mediator Command。
- 领域事件严禁跨越模块边界:聚合根通过
AddDomainEvent()产生的事件仅在当前模块内部、同一事务的执行管道中分发;跨模块通知必须转换为明确的集成事件。 - 数据库 Schema 严格隔离:各模块在物理数据库中拥有独立的表前缀或独立的 Database Schema,严禁书写跨模块表的隐式 SQL
JOIN查询。
核心术语字典(Glossary)
| 核心术语 | 英文对照 | 架构定义与规范约束 |
|---|---|---|
| 模块化单体 | Modular Monolith | 将多个高度内聚、业务边界清晰的领域模块集成于单一 .NET 解决方案中。代码以单体形式部署,内部依赖受 ArchUnit 门禁强制检验。 |
| 垂直切片 | Vertical Slice | 按照独立的业务用例(Use Case)垂直组织代码,一个用例包含其路由、命令、规则与处理器,替代横向分层。 |
| 统一聚合根 | Unified Aggregate Root | 承载业务状态、不变量守门与领域事件产出的实体基类,同时兼备持久化元数据,避免多余的 DTO 映射。 |
| 10 级执行管道 | 10-Tier Application Pipeline | 基于 Mediator 的线性责任链,由框架全自动执行日志、授权、校验、幂等、事务、事件分发与结构化审计。 |
| 四阶业务校验 | 4-Tier Validation Pattern | 统一静态基础规则(Tier 1)+ 复合业务策略(Tier 2A)+ 租户动态热配置(Tier 2B)+ 现场低代码规则(Tier 3)。 |
| 事务性发件箱 | Transactional Outbox | 业务数据持久化与消息发布在同一数据库事务中原子写入,由后台守护进程可靠投递至 RabbitMQ 等消息中介。 |
| 代入操作 | Impersonation | 运维或技术支持人员经租户授权后,以受限操作员身份登录排查问题,写操作被安全管道严格限制。 |
| Native AOT | Ahead-of-Time Compilation | .NET 10 的预先编译技术,将 C# 代码直接编译为平台原生机器码,消除 JIT 开销并实现秒级极速冷启动。 |
解决方案物理组织架构
在 /Users/linxinyu/Git/Repos/Codeup/BitzOrcasVNext 中,源码仓库按照严格的工程边界进行物理分层:
src/├── Framework/ # 零业务依赖的纯技术底座│ ├── BitzOrcas.Application/ # 10 级管道行为、校验策略接口、授权抽象│ ├── BitzOrcas.Domain/ # 实体基类、统一聚合根接口、Result/Error 原语│ ├── BitzOrcas.Persistence/ # 双持久化 Adapter (SqlSugar / EF Core) 与元数据│ └── BitzOrcas.Workflow/ # 自研轻量级 DAG 状态机工作流引擎内核├── Platform/ # 平台通用商业能力模块 (以 NuGet/私有包交付)│ ├── Identity/ # 多租户管理、用户认证、2FA、外部登录与密码加密│ ├── Authorization/ # RBAC、ABAC、ReBAC Lite 统一授权决策中心│ ├── Auditing/ # 全局活动审计日志、实体变更 Diff 追踪与信封│ ├── Files/ # 对象存储抽象、分片上传与文件生命周期│ └── Notifications/ # 站内信、邮件、短信多通道消息分发├── Hosts/ # 运行宿主与组合根 (Composition Root)│ ├── BitzOrcas.Api/ # Minimal API 主程序入口,装配全量模块路由│ ├── BitzOrcas.Gateway/ # YARP 边缘反向代理与流量调度中心│ └── BitzOrcas.JobHost/ # Quartz.NET 独立作业宿主,承载租户定时任务└── Tooling/ # 研发效能与工程工具链 ├── BitzOrcas.Cli/ # 官方 CLI 脚手架,一键生成垂直切片与模块 └── BitzOrcas.Generators/ # Roslyn 增量源生成器,消除反射装配通过这一套严谨的架构设计,BitzOrcas.Modern 既赋予了开发者在单体中飞速编码与联调的敏捷度,又赋予了企业在架构演进至超大规模时无缝拆分微服务的物理自由度。