传统的三层架构(Controllers → Services → Repositories)按照“技术职责”水平切分。随着系统规模扩大,任何一次业务变更都必须修改 6~8 个分散的文件,不仅导致团队开发冲突频繁,而且催生了大量职责不清的“上帝服务(God Service)”。
BitzOrcas.Modern 采用垂直切片架构(Vertical Slice Architecture):按照“业务用例(Use Case)”纵向组织代码,遵循 “一用例一文件(One Use Case, One File)” 原则。
垂直切片结构解剖与执行管道时序
垂直切片解剖:一用例一文件标准范式
在 BitzOrcas 中,一个完整的 Command 或 Query 垂直切片代码如下:
using System;using System.Threading;using System.Threading.Tasks;using BitzOrcas.Application.Abstractions.Tenancy;using BitzOrcas.Application.Authorization;using BitzOrcas.Domain.Abstractions;using BitzOrcas.Domain.Results;using BitzOrcas.Endpoint.Attributes;using BitzOrcas.Modules.Legal.Contracts;using BitzOrcas.Modules.Legal.Domain;using Mediator;
namespace BitzOrcas.Modules.Legal.Application.Matters;
/// <summary>/// 提交民商事立案申请命令/// </summary>/// <remarks>/// 由 Roslyn 增量生成器在编译期直接映射为 Minimal API 端点。/// </remarks>[GenerateEndpoint(HttpRoute.Post, "/api/legal/matters", Tag = "Matters")]public sealed record CreateMatterIntakeCommand( string MatterTitle, string ClientName, string OpposingPartyName, decimal ClaimAmount, bool IsCrossBorder) : ICommand<Result<string>>, IAuthorizedRequest{ /// <summary> /// 受保护资源 /// </summary> public ResourceDescriptor Resource { get; } = new("legal", "matter");
/// <summary> /// 授权动作 /// </summary> public AuthorizationAction Action { get; } = AuthorizationAction.Create;}
/// <summary>/// 案件立案前置校验规则/// </summary>/// <remarks>/// 由 10 级管道中的验证中间件在进入 Handler 前自动执行。/// </remarks>public sealed class CreateMatterIntakeCommandRule : IRequestRule<CreateMatterIntakeCommand>{ public Result Validate(CreateMatterIntakeCommand command) { // 1. 标题长度校验 if (string.IsNullOrWhiteSpace(command.MatterTitle) || command.MatterTitle.Length > 200) { return Result.Failure(LegalErrors.MatterTitleInvalid); }
// 2. 诉讼标的额必须为正数 if (command.ClaimAmount <= 0) { return Result.Failure(LegalErrors.ClaimAmountPositive); }
return Result.Success(); }}
/// <summary>/// 案件立案命令处理器/// </summary>/// <remarks>/// 聚焦于纯粹的领域业务编排,事务与审计由 10 级管道治理。/// </remarks>public sealed class CreateMatterIntakeCommandHandler( ICommandRepository<MatterIntake, string> repository, ICurrentTenant currentTenant) : ICommandHandler<CreateMatterIntakeCommand, Result<string>>{ public async ValueTask<Result<string>> Handle( CreateMatterIntakeCommand request, CancellationToken cancellationToken) { var tenant = currentTenant.Tenant; if (!tenant.IsAvailable) { return Result.Failure<string>(LegalErrors.TenantRequired); }
// 1. 编排业务流水号 var matterCode = $"MAT-{DateTimeOffset.UtcNow:yyyyMMdd}-{Random.Shared.Next(10000, 99999)}";
// 2. 调用领域聚合根工厂校验领域不变量 var intakeResult = MatterIntake.CreateIntake( tenantId: tenant.EffectiveTenantId, matterCode: matterCode, matterTitle: request.MatterTitle, clientName: request.ClientName, opposingPartyName: request.OpposingPartyName, claimAmount: request.ClaimAmount, isCrossBorder: request.IsCrossBorder);
if (intakeResult.IsFailure) { return Result.Failure<string>(intakeResult.Error); }
var matter = intakeResult.GetValueOrThrow();
// 3. 提交持久化 (事务、CAP 领域事件发布与结构化审计 Diff 均由 10 级管道接管) var saveResult = await repository.SaveAsync(matter, cancellationToken); return saveResult.IsFailure ? Result.Failure<string>(saveResult.Error) : Result.Success(matterCode); }}10 级执行管道职责矩阵
| 执行顺序 | 管道行为 (Pipeline Behavior) | 核心职责 | 拦截行为 |
|---|---|---|---|
1 | LoggingPipelineBehavior | 记录入站请求耗时与绑定 TraceId | 记录完整日志 |
2 | RuntimeLicensePipelineBehavior | 平台商业授权证书与租户席位校验 | 失效返回 403 |
3 | DelegatedSessionRestrictionPipelineBehavior | 运营代客操作(Impersonation)写操作限制 | 越权返回 403 |
4 | AuthorizationPipelineBehavior | 声明式资源动作 RBAC / ABAC 强类型鉴权 | 权限不足返回 403 |
5 | ValidationPipelineBehavior | 执行 IRequestRule 与多租户策略校验 | 校验失败返回 400 |
6 | IdempotencyPipelineBehavior | Redis 分布式防重放与并发锁 | 重复安全返回缓存 |
7 | TransactionPipelineBehavior | 自动开启数据库事务并在成功后提交 | 异常自动回滚 |
8 | DomainEventDispatchPipelineBehavior | 事务内聚合根领域事件分发与 CAP 投递 | 保证强一致 |
9 | ActivityAuditPipelineBehavior | 记录操作人、IP 与变更前/后 Diff 快照 | 异步批量写入 |
10 | ReadModelDisplayPipelineBehavior | 查询结果字典元数据与多语言文本自动充水 | 零反射极速序列化 |
总结
垂直切片架构让团队拥有了极高的开发交付效率与极低的重构成本:
- 修改用例只需打开一个文件;
- 废弃用例只需直接删除该文件;
- 治理逻辑完全外置在 10 级管道中,代码整洁干净。