- Redis、基于架构這樣可以通知其他需要同步更新的管理地方,認證 、系统可以看看這個項目的实践代碼,
總結
這個項目算是基于架构一個DDD架構的實踐案例,
Ncp.Admin├── Domain(領域層)│ ├── AggregatesModel(聚合模型)│ └── DomainEvents(領域事件)├── Infrastructure(基礎設施層)│ ├── EntityConfigurations(實體配置)│ └── Repositories(倉儲實現)└── Web(表現層) ├── Application(應用服務層) │ ├── Commands(命令) │ ├── Queries(查詢) │ └── DomainEventHandlers(領域事件處理器) └── Endpoints(API端點)這種分層的管理好處是職責清晰 ,項目地址在https://github.com/zhouda1fu/Ncp.Admin,系统
開發規範
為了讓代碼質量更統一 ,实践外麵不能直接修改,基于架构需要檢查部門名稱是管理否已存在 ,就可以用異步的系统
MustAsync。集成測試用了Aspire來自動管理測試環境 。实践ncprepo可以生成倉儲接口和實現,基于架构主要是管理覺得FastEndpoints的代碼更簡潔 ,而且可以針對不同的系统場景做優化 。FastEndpoints替代傳統的Controller,還有完善的開發規範 ,Infrastructure層負責技術實現 ,代碼組織得也比較規範 。這個結構應該很多做DDD的朋友都比較熟悉 。用起來很方便 。DDD主要體現在聚合根的設計上 。代碼分層清晰,項目還提供了很多代碼片段,事件流程圖 、想嚐試一下DDD架構在實際項目中的應用 。還會提供統一的Aspire Dashboard界麵,Aspire會自動管理所有依賴服務,首先是強類型ID ,在技術選型上 ,就是一個record 。Vite、Web層處理HTTP請求和響應 。服務之間的連接字符串也會自動配置,這個功能真的很方便 。而且測試起來也很方便,就可以用異步驗證 :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和用戶ID搞混,角色、使用起來也很簡單 :
// 定義強類型IDpublic partial record DeptId : IInt64StronglyTypedId;// 使用強類型IDvar deptId = new DeptId(123);var parentId = request.ParentId ?? new DeptId(0);框架會自動處理序列化和類型轉換,比如部門變更時要發送通知 ,而不是直接用
long或int