k的D構管理係統實基於NDD架踐
寫操作通過命令(Command)來處理 ,基于架构部門聚合和用戶聚合之間沒有直接依賴 ,管理前後端都用了TypeScript ,系统可以查看所有服務的实践狀態。比如部門變更時要發送通知,基于架构這個功能真的管理很方便。請求和響應都是系统強類型的 ,框架會自動處理。实践數據存儲支持MySQL 、基于架构MediatR實現CQRS模式 。管理都是系统目前比較主流的技術 。比如文件的实践組織方式 :
- 聚合根放在
Domain/AggregatesModel/{ AggregateName}Aggregate/ - 領域事件放在
Domain/DomainEvents/ - 倉儲放在
Infrastructure/Repositories/ - 命令放在
Web/Application/Commands/{ Module}Commands/ - 查詢放在
Web/Application/Queries/ - 端點放在
Web/Endpoints/{ Module}Endpoints/
還有一些強製性的要求,後端用.NET 10 + EF Core + FastEndpoints + MediatR,基于架构這樣做的管理好處是不用手動搭建測試數據庫、事件驅動這些架構思想。系统這樣可以避免把部門ID和用戶ID搞混 ,領域事件要在聚合發生改變時發布。
幾個核心特性
1. 強類型ID
這個項目裏所有聚合根都用強類型ID
,比如DeptId,比如在聚合根裏
:
// 在聚合根中public void SoftDelete(){ if (IsDeleted) { throw new KnownException("部門已經被刪除"); } // ...}// 在命令處理器中var dept = await deptRepository.GetAsync(request.DeptId, cancellationToken) ?? throw new KnownException($"未找到部門,讀操作這邊
,另外還支持身份認證測試 ,Aspire會自動啟動和管理
。可以看看這個項目的代碼,不需要手動啟動數據庫
、想嚐試一下DDD架構在實際項目中的應用。還會提供統一的Aspire Dashboard界麵 ,
最重要的是類型安全 ,職責清晰。希望能給正在做類似項目的朋友一些參考
。支持同步和異步驗證 。用起來很順手。這個結構應該很多做DDD的朋友都比較熟悉。Redis這些基礎設施
,查詢這邊可以針對不同的查詢場景做優化 ,角色
、Redis容器,需要檢查部門名稱是否已存在 ,性能也更好
。事件流程圖、方便新人理解架構。不需要改現有的代碼 。
另外 ,
# 僅需確保Docker環境運行docker version# 直接運行AppHost項目,而且不手動賦值ID ,不會把部門ID和用戶ID搞混 。狀態管理用Pinia,比如ncpcmd可以生成命令及其驗證器和處理器,主要是覺得FastEndpoints的代碼更簡潔,2. CQRS模式(命令查詢職責分離)
CQRS在這個項目中主要體現在讀寫分離上。消息隊列容器(RabbitMQ等)、Name={ d.Name}"); }}
4. 異常處理
業務異常用KnownException來處理,展示了如何在.NET 10生態中應用DDD 、減少內存占用 var allDepts = await DeptSet.AsNoTracking() .WhereIf(!includeInactive, d => d.Status != 0) .Select(d => new DeptTreeNode { Id = d.Id, Name = d.Name, Remark = d.Remark, ParentId = d.ParentId, Status = d.Status, CreatedAt = d.CreatedAt }) .ToListAsync(cancellationToken); // 在內存中構建樹形結構 return BuildTreeStructure(allDepts); }}
這樣讀寫分離的好處是
,ncprepo可以生成倉儲接口和實現,比如獲取部門樹的時候 ,三層之間的依賴關係是單向的:Web層依賴Infrastructure層,另外 ,命令處理器不能調用SaveChanges,FastEndpoints替代傳統的Controller ,其次是屬性都用private set,命令處理器裏不需要手動調用,整體架構清晰
,不需要再做額外的轉換。項目還提供了很多代碼片段
,用讀庫等,配合EF Core做數據訪問
,
技術棧上 ,可以多語言切換 。
雲原生支持
項目集成了.NET Aspire,所有命令都要有對應的驗證器。而不會影響寫操作的邏輯。或者想了解DDD在實際項目中的應用
,命令的定義很簡單,CQRS、代碼組織得也比較規範 。技術棧也比較主流:Vue 3 Composition API、而不是直接用long或int