Skip to content
bitzorcas
EN

Reference

核心构建块

基础领域原语 — Entity\<TId\>、AggregateRoot\<TId\>、Result\<T\>、领域事件、值对象、租户抽象,以及每个模块所依赖的完整类型层次。

Last updated

BitzOrcas.Domain 是零依赖基础层,所有其他构建块和模块都围绕它进行组合。它不包含任何运行时激活的代码——没有 DI 注册、没有中间件、没有宿主服务——只有每个领域层所需的共享抽象:实体基类、聚合根标记、Result<T> 错误处理模式、领域事件、值对象和租户接口。

提供内容

实体基类

  • Entity<TId> — 抽象类;携带 Id(默认使用 Yitter 雪花 ID 生成)、私有领域事件列表(通过 DomainEvents 暴露)以及受保护方法 AddDomainEvent() / ClearDomainEvents()。所有持久化实体都继承自此类。
  • AggregateRoot<TId> — 继承 Entity<TId>;聚合根的语义标记——一致性边界。当前不添加额外成员,但为你提供了聚合级别的辅助方法扩展点。
  • IEntity<TId> — 最小实体契约:TId Id { get; }

横切接口

  • ITenantEntityTenantId TenantId { get; }。由 TenantEntityBase 实现;标记实体为租户范围。SqlSugar 全局查询过滤器使用此接口来执行多租户隔离。
  • IAuditableEntityCreatedAtCreatedByLastModifiedAtLastModifiedBy。由 SqlSugar 审计拦截器自动填充。
  • ISoftDelete — 软删除标记。实现此接口的实体通过 SqlSugar 全局过滤器默认隐藏;可通过显式查询绕过。
  • IConcurrencyTracked — 通过行版本进行乐观并发跟踪。

Result<T> 模式

BitzOrcas 使用 Result<T> 单子代替抛出异常来处理领域失败:

类型用途
Result<T>包装成功值或 Error
Error结构化错误,包含 ErrorType、code 和 description
ErrorType枚举:ValidationNotFoundConflictUnauthorizedForbiddenFailureInfrastructure
// 领域服务返回 Result 而非抛出异常
public Result<Note> CreateNote(string title, string content)
{
if (string.IsNullOrWhiteSpace(title))
return Result<Note>.Failure(Error.Validation("Note.Title", "标题不能为空"));
var note = new Note(title, content);
return Result<Note>.Success(note);
}

领域事件

DomainEvent 是一个抽象 record,由 Mediator 管道中的 DomainEventDispatchPipelineBehavior 自动分发:

public record NoteCreatedDomainEvent(Guid NoteId, string Title) : DomainEvent;

事件在聚合中收集,在事务提交后分发——不需要 SaveChangesInterceptor

值对象

值对象提供类型安全的原语:

  • NoteTitle — 具有最大长度约束的非空字符串
  • EmailAddress — 已验证的邮件格式
  • ValueObject — 具有值语义相等性的基类

租户抽象

  • TenantId — 强类型租户标识符(包装 string
  • TenancyMode — 枚举:SingleTenantMultiTenant
  • TenancyDefaults — 默认租户 ID 常量

时钟抽象

  • IAppClock — 可注入的时钟,用于可测试的时间相关逻辑;默认为 SystemClock,支持可配置时区(默认上海 UTC+8,可切换为 UTC)

程序集参考

BitzOrcas.Domain
├── Contracts/ → IAuditableEntity, ISoftDelete, ITenantEntity, IConcurrencyTracked
├── Entities/ → `Entity<TId>`, `AggregateRoot<TId>`, DomainEvent, IDomainEvent
├── Results/ → `Result<T>`, Result, Error, ErrorType, IResult
├── Tenancy/ → TenantId, TenancyMode, TenancyDefaults
├── ValueObjects/ → ValueObject, EmailAddress, NoteTitle
└── Abstractions/ → IAppClock