Skip to content
bitzorcas
中EN

Concept

垂直切片架构:以业务用例为核心的高内聚解耦

深度剖析 BitzOrcas.Modern 垂直切片架构(Vertical Slice Architecture):一用例一文件组织形式、10 级管道守门机制、统一聚合根持久化与彻底告别分层架构。

Last updated

传统的三层架构(Controllers → Services → Repositories)按照“技术职责”水平切分。随着系统规模扩大,任何一次业务变更都必须修改 6~8 个分散的文件,不仅导致团队开发冲突频繁,而且催生了大量职责不清的“上帝服务(God Service)”。

BitzOrcas.Modern 采用垂直切片架构(Vertical Slice Architecture):按照“业务用例(Use Case)”纵向组织代码,遵循 “一用例一文件(One Use Case, One File)” 原则。

垂直切片结构解剖与执行管道时序

10 级线性执行管道 (Mediator Behaviors)单个垂直切片文件: CreateMatterIntakeCommand.cs

1. [GenerateEndpoint] Minimal API 端点元数据

2. CreateMatterIntakeCommand (强类型入参契约)

3. CreateMatterIntakeCommandRule (IRequestRule 纯函数校验)

4. CreateMatterIntakeCommandHandler (业务领域编排)

Logging -> License -> Impersonation -> Auth

Validation (执行 IRequestRule) -> Idempotency

Transaction (开启事务) -> Events -> Audit -> ReadModel


垂直切片解剖:一用例一文件标准范式

在 BitzOrcas 中,一个完整的 Command 或 Query 垂直切片代码如下:

src/Modules/Legal/BitzOrcas.Modules.Legal/Application/Matters/CreateMatterIntakeCommand.cs
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)核心职责拦截行为
1LoggingPipelineBehavior记录入站请求耗时与绑定 TraceId记录完整日志
2RuntimeLicensePipelineBehavior平台商业授权证书与租户席位校验失效返回 403
3DelegatedSessionRestrictionPipelineBehavior运营代客操作(Impersonation)写操作限制越权返回 403
4AuthorizationPipelineBehavior声明式资源动作 RBAC / ABAC 强类型鉴权权限不足返回 403
5ValidationPipelineBehavior执行 IRequestRule 与多租户策略校验校验失败返回 400
6IdempotencyPipelineBehaviorRedis 分布式防重放与并发锁重复安全返回缓存
7TransactionPipelineBehavior自动开启数据库事务并在成功后提交异常自动回滚
8DomainEventDispatchPipelineBehavior事务内聚合根领域事件分发与 CAP 投递保证强一致
9ActivityAuditPipelineBehavior记录操作人、IP 与变更前/后 Diff 快照异步批量写入
10ReadModelDisplayPipelineBehavior查询结果字典元数据与多语言文本自动充水零反射极速序列化

总结

垂直切片架构让团队拥有了极高的开发交付效率与极低的重构成本:

  • 修改用例只需打开一个文件;
  • 废弃用例只需直接删除该文件;
  • 治理逻辑完全外置在 10 级管道中,代码整洁干净。

100%

滚轮或按钮缩放 · 放大后拖动画面 · 双击切换 100% / 200%