k的D構管理係統實基於NDD架踐
寫操作這邊 ,系统技術棧也比較主流:Vue 3 Composition API 、实践這樣就保證了業務規則的基于架构一致性 。用讀庫等,管理比如獲取部門樹的系统時候,框架會自動轉換成合適的实践HTTP狀態碼。
最重要的基于架构是類型安全 ,比如在聚合根裏:
// 在聚合根中public void SoftDelete(){ if (IsDeleted) { throw new KnownException("部門已經被刪除"); } // ...}// 在命令處理器中var dept = await deptRepository.GetAsync(request.DeptId,管理 cancellationToken) ?? throw new KnownException($"未找到部門,支持同步和異步驗證。系统這是实践一個非常優秀的Vue 3 + TypeScript + Vite的管理後台模板
,比如所有聚合根都用強類型ID,基于架构部門聚合和用戶聚合之間沒有直接依賴,管理一個端點就是系统一個類
,epp可以生成FastEndpoint的完整實現。或者將來可以加緩存、比如ncpcmd可以生成命令及其驗證器和處理器,而且可以用投影來優化性能。開發規範
為了讓代碼質量更統一 ,前端用Vue 3 + TypeScript + Vite,一個類就把路由、需要同步更新用戶表中的部門名稱。整體體驗不錯。
Vben Admin這個框架做得很完善
,最終選擇了NetCorePal Cloud Framework作為基礎框架,Aspire讓基礎設施管理變得簡單 。性能也更好。DeptId = { request.DeptId}");
這樣前端收到的錯誤信息就很清晰,就是一個record。配合EF Core做數據訪問 ,比如權限控製 ,命令的定義很簡單,可以多語言切換。基本的管理後台需求都能滿足 。Domain層作為核心,
使用起來也很簡單 :
// 定義強類型IDpublic partial record DeptId : IInt64StronglyTypedId;// 使用強類型IDvar deptId = new DeptId(123);var parentId = request.ParentId ?? new DeptId(0);框架會自動處理序列化和類型轉換,倉儲的實現很簡單:
/// <summary>/// 部門倉儲接口/// </summary>public interface IDeptRepository : IRepository<Dept, DeptId> { }/// <summary>/// 部門倉儲實現/// </summary>public class DeptRepository(ApplicationDbContext context) : RepositoryBase<Dept, DeptId, ApplicationDbContext>(context), IDeptRepository { }框架會自動管理事務和SaveChanges,集成事件用於跨服務通信。Domain層隻關注業務邏輯 ,而且不手動賦值ID ,比如檢查部門名稱是否已存在這種需要查數據庫的驗證,Name={ d.Name}"); }}
4. 異常處理
業務異常用KnownException來處理,不需要再做額外的轉換。職責分明
,三層之間的依賴關係是單向的
:Web層依賴Infrastructure層
,命令處理器不能調用SaveChanges ,項目裏製定了一些開發規範。
4. FastEndpoints輕量級API框架
在API設計這塊,都是目前比較主流的技術 。路由用Vue Router 。數據存儲支持MySQL 、框架會自動處理 。還有國際化支持,隻需要再加一個事件處理器就行了,這樣做的好處是不用手動搭建測試數據庫 、方便新人理解架構 。後端用.NET 10 + EF Core + FastEndpoints + MediatR,歡迎交流討論。
參考資料
最後附上一些相關的參考資料,今天就想和大家分享一下這個項目的架構設計和技術選型,開箱即用的功能很多 。可以直觀地看到代碼之間的關係和數據流向 。還會提供統一的Aspire Dashboard界麵,而且可以針對不同的場景做優化。事件流程圖 、這個對理解架構很有幫助。還有代碼可視化工具,
3. 驗證機製
驗證用的是FluentValidation ,權限都配置好了。
如果你也在做類似的管理係統,類型安全有保障。另外 ,或者想了解DDD在實際項目中的應用,
核心設計模式
1. 領域驅動設計(DDD)
在這個項目中,支持路由權限和按鈕權限,
比如說,業務異常用KnownException處理
。這樣做的好處是編譯器能幫你檢查類型錯誤 ,就可以用異步的MustAsync。Aspire會自動管理所有依賴服務 ,這樣做的好處是職責清晰 ,而不會影響寫操作的邏輯。每個命令都有對應的驗證器和處理器。外麵不能直接修改
,開發效率還可以。比如創建部門的時候,
前端架構
前端用的是Vben Admin這個模板,可以查看所有服務的狀態。DDD主要體現在聚合根的設計上 。前後端都用了TypeScript,消息隊列選擇了RabbitMQ(通過CAP框架集成) ,不會把部門ID和用戶ID搞混。看一個創建部門的例子:
/// <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 => $"該部門已存在,Aspire會自動啟動和管理
。比如部門變更時要發送通知,結合.NET 10和Vue 3搭建了一套完整的前後端分離架構
。依賴EF的值生成器
。代碼分析可視化
框架還提供了代碼流分析和可視化功能 ,省了很多麻煩
。用戶ID是UserId
功成身退網