BitzOrcas.Domain 是零依赖基础层,所有其他构建块和模块都围绕它进行组合。它不包含任何运行时激活的代码——没有 DI 注册、没有中间件、没有宿主服务——只有每个领域层所需的共享抽象:实体基类、聚合根标记、Result<T> 错误处理模式、领域事件、值对象和租户接口。
提供内容
实体基类
Entity<TId>— 抽象类;携带Id(默认使用 Yitter 雪花 ID 生成)、私有领域事件列表(通过DomainEvents暴露)以及受保护方法AddDomainEvent()/ClearDomainEvents()。所有持久化实体都继承自此类。AggregateRoot<TId>— 继承Entity<TId>;聚合根的语义标记——一致性边界。当前不添加额外成员,但为你提供了聚合级别的辅助方法扩展点。IEntity<TId>— 最小实体契约:TId Id { get; }。
横切接口
ITenantEntity—TenantId TenantId { get; }。由TenantEntityBase实现;标记实体为租户范围。SqlSugar 全局查询过滤器使用此接口来执行多租户隔离。IAuditableEntity—CreatedAt、CreatedBy、LastModifiedAt、LastModifiedBy。由 SqlSugar 审计拦截器自动填充。ISoftDelete— 软删除标记。实现此接口的实体通过 SqlSugar 全局过滤器默认隐藏;可通过显式查询绕过。IConcurrencyTracked— 通过行版本进行乐观并发跟踪。
Result<T> 模式
BitzOrcas 使用 Result<T> 单子代替抛出异常来处理领域失败:
| 类型 | 用途 |
|---|---|
Result<T> | 包装成功值或 Error |
Error | 结构化错误,包含 ErrorType、code 和 description |
ErrorType | 枚举:Validation、NotFound、Conflict、Unauthorized、Forbidden、Failure、Infrastructure |
// 领域服务返回 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— 枚举:SingleTenant、MultiTenantTenancyDefaults— 默认租户 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