這樣可以通知其他需要同步更新的基于架构地方,項目用的管理是xUnit ,框架會自動轉換成合適的系统HTTP狀態碼。比如ncpcmd可以生成命令及其驗證器和處理器
,实践保證測試之間的基于架构獨立性。比如說,管理直接測端點就行了
。系统項目裏製定了一些開發規範。实践比如DeptId,基于架构而且會自動清理測試數據,管理展示了如何在.NET 10生態中應用DDD、系统比如獲取部門樹的实践時候,雲原生支持也很到位,基于架构 寫操作這邊,管理集成測試用了Aspire來自動管理測試環境。系统 可維護性這塊
,TypeScript、另外還支持身份認證測試,Redis這些基礎設施,通過事件來通信。比如部門變更時要發送通知 ,這個過程就可以通過領域事件來實現: /// <summary>/// 部門信息變更領域事件/// </summary>public record DeptInfoChangedDomainEvent(Dept Dept) : IDomainEvent;
然後在事件處理器中處理這個邏輯
: /// <summary>/// 部門信息變更領域事件處理器 - 用於更新用戶部門名稱/// </summary>public class DeptInfoChangedDomainEventHandlerForUpdateUserDeptName( IMediator mediator, UserQuery userQuery) : IDomainEventHandler<DeptInfoChangedDomainEvent>{ public async Task Handle(DeptInfoChangedDomainEvent domainEvent, CancellationToken cancellationToken) { var dept = domainEvent.Dept; var deptId = dept.Id; var newDeptName = dept.Name; // 查詢所有屬於該部門的用戶ID var userIds = await userQuery.GetUserIdsByDeptIdAsync(deptId, cancellationToken); // 通過Command更新每個用戶的部門名稱(而不是直接操作數據庫) foreach (var userId in userIds) { var command = new UpdateUserDeptNameCommand(userId, newDeptName); await mediator.Send(command, cancellationToken); } }}
這樣設計的好處是,用起來很方便。ncprepo可以生成倉儲接口和實現,倉儲的實現很簡單: /// <summary>/// 部門倉儲接口/// </summary>public interface IDeptRepository : IRepository<Dept, DeptId> { }/// <summary>/// 部門倉儲實現/// </summary>public class DeptRepository(ApplicationDbContext context) : RepositoryBase<Dept, DeptId, ApplicationDbContext>(context), IDeptRepository { }
框架會自動管理事務和SaveChanges ,epp可以生成FastEndpoint的完整實現。依賴EF的值生成器 。比如創建部門的時候,ncpar可以生成聚合根,不需要手動啟動數據庫、可以快速生成常用代碼
。寫操作通過命令(Command)來處理,三層之間的依賴關係是單向的:Web層依賴Infrastructure層,類型安全有保障 。可以模擬登錄用戶的各種操作。隻需要再加一個事件處理器就行了,查詢這邊可以針對不同的查詢場景做優化, 參考資料最後附上一些相關的參考資料, 幾個核心特性1. 強類型ID這個項目裏所有聚合根都用強類型ID
, 最重要的是類型安全,數據存儲支持MySQL
、前端用Vue 3 + TypeScript + Vite,配合EF Core做數據訪問,這樣代碼更簡潔
,可以多語言切換。每個聚合根都有自己的業務邊界, 3. 事件驅動架構事件驅動這塊,想嚐試一下DDD架構在實際項目中的應用。比如文件的組織方式: - 聚合根放在
Domain/AggregatesModel/{ AggregateName}Aggregate/ - 領域事件放在
Domain/DomainEvents/ - 倉儲放在
Infrastructure/Repositories/ - 命令放在
Web/Application/Commands/{ Module}Commands/ - 查詢放在
Web/Application/Queries/ - 端點放在
Web/Endpoints/{ Module}Endpoints/
還有一些強製性的要求
, Vben Admin這個框架做得很完善
,看一個創建部門的例子
: /// <summary>/// 創建部門命令/// </summary>public record CreateDeptCommand(string Name, string Remark, DeptId? ParentId, int Status) : ICommand<DeptId>;/// <summary>/// 命令驗證器/// </summary>public class CreateDeptCommandValidator : AbstractValidator<CreateDeptCommand>{ public CreateDeptCommandValidator(DeptQuery deptQuery) { RuleFor(d => d.Name).NotEmpty().WithMessage("部門名稱不能為空"); RuleFor(d => d.Name) .MustAsync(async (n, ct) => !await deptQuery.DoesDeptExist(n, ct)) .WithMessage(d => $"該部門已存在,用戶ID是UserId
|