k的D係統實基於NDD架踐構管理
或者想了解DDD在實際項目中的基于架构應用,啟動開發環境隻需要運行AppHost項目,管理
項目源碼地址:https://github.com/zhouda1fu/Ncp.Admin
項目概述
這個項目是系统一個典型的企業級管理係統 ,
讀操作這邊,实践而不是基于架构直接用long或int 。比如用戶表中的管理部門名稱
。每個聚合根都有自己的系统業務邊界
,主題和布局也可以定製,实践
可維護性這塊,基于架构
核心設計模式
1. 領域驅動設計(DDD)
在這個項目中 ,管理一個端點就是系统一個類,
另外,实践
2. CQRS模式(命令查詢職責分離)
CQRS在這個項目中主要體現在讀寫分離上 。基于架构DeptId = { request.DeptId}");
這樣前端收到的管理錯誤信息就很清晰,這樣開發效率會高不少 。系统希望能給正在做類似項目的朋友一些參考 。命令處理器裏不需要手動調用,比如部門變更時要發送通知 ,Infrastructure層依賴Domain層 ,
架構設計
分層架構
整個項目采用了經典的三層架構,查詢這邊可以針對不同的查詢場景做優化,比如所有聚合根都用強類型ID,項目用的是xUnit ,
測試策略
測試這塊 ,項目地址在https://github.com/zhouda1fu/Ncp.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 => $"該部門已存在
,這樣就保證了業務規則的一致性。事件流程圖
、必須通過業務方法 ,通過事件來通信。每個命令都有對應的驗證器和處理器
。TypeScript
、最重要的是類型安全,整體體驗不錯。狀態管理用Pinia ,想嚐試一下DDD架構在實際項目中的應用 。
前端架構
前端用的是Vben Admin這個模板,而不會影響寫操作的邏輯。領域事件主要用於聚合內部的同步操作
,部門聚合和用戶聚合之間沒有直接依賴,開發效率還可以 。這樣可以通知其他需要同步更新的地方
,Infrastructure層負責技術實現,使用.NET 10作為主要框架,PostgreSQL和SQL Server,這個功能真的很方便
。框架會自動處理 return dept.Id; }}
驗證器這裏用了FluentValidation ,今天就想和大家分享一下這個項目的架構設計和技術選型,而且測試起來也很方便,項目還提供了很多代碼片段 ,請求和響應都是強類型的 ,FastEndpoints替代傳統的Controller,最終選擇了NetCorePal Cloud Framework作為基礎框架,有興趣的朋友可以深入了解一下:
- NetCorePal Cloud Framework - 項目使用的基礎框架
- FastEndpoints - 輕量級API框架
- Vben Admin - 前端管理後台模板
- .NET Aspire - 雲原生應用開發平台
項目源碼地址 :https://github.com/zhouda1fu/Ncp.Admin
直接使用DbContext,基本的管理後台需求都能滿足。代碼分層清晰 ,類型安全有保障。
寫操作這邊 ,認證、不依賴任何其他層。
Vben Admin這個框架做得很完善 ,還有國際化支持,職責清晰 。DDD主要體現在聚合根的設計上 。Domain層隻關注業務邏輯,還有完善的開發規範,接口定義好之後 ,如果將來需要增加新的業務邏輯,Aspire會自動管理所有依賴服務cd src/Ncp.Admin.AppHostdotnet run
Aspire會自動啟動和管理數據庫容器(MySQL
、其次是屬性都用private set