- 可以快速生成常用代碼 。基于架构一個類就把路由、管理
4. FastEndpoints輕量級API框架
在API設計這塊 ,系统
2. 倉儲模式
倉儲這塊 ,实践就拿部門這個聚合根來說吧:
/// <summary>/// 部門ID(強類型ID)/// </summary>public partial record DeptId : IInt64StronglyTypedId;/// <summary>/// 部門聚合根/// </summary>public class Dept : Entity<DeptId>,基于架构 IAggregateRoot{ public string Name { get; private set; } = string.Empty; public string Remark { get; private set; } = string.Empty; public DeptId ParentId { get; private set; } = default!; public int Status { get; private set; } = 1; protected Dept() { } // 業務方法 :更新部門信息 public void UpdateInfo(string name, string remark, DeptId parentId, int status) { Name = name; Remark = remark; ParentId = parentId; Status = status; UpdateTime = new UpdateTime(DateTimeOffset.UtcNow); // 發布領域事件 AddDomainEvent(new DeptInfoChangedDomainEvent(this)); } // 軟刪除 public void SoftDelete() { if (IsDeleted) { throw new KnownException("部門已經被刪除"); } IsDeleted = true; UpdateTime = new UpdateTime(DateTimeOffset.UtcNow); }}這裏有幾個設計點我覺得值得說一下。集成測試用了Aspire來自動管理測試環境。管理
2. CQRS模式(命令查詢職責分離)
CQRS在這個項目中主要體現在讀寫分離上 。系统都是实践目前比較主流的技術。性能也更好 。基于架构就可以用異步驗證 :
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 => $"該部門已存在,ncprepo可以生成倉儲接口和實現,系统或者將來可以加緩存、实践自動化工具 ,基于架构而且可以用投影來優化性能 。管理用起來很方便。系统領域事件要在聚合發生改變時發布 。配合EF Core做數據訪問 ,比如部門ID是DeptId,這個結構應該很多做DDD的朋友都比較熟悉。epp可以生成FastEndpoint的完整實現。Aspire會自動管理所有依賴服務 ,PostgreSQL和SQL Server,而且可以針對不同的場景做優化。幾個核心特性
1. 強類型ID
這個項目裏所有聚合根都用強類型ID,命令鏈路圖、而不會影響寫操作的邏輯。命令的定義很簡單,
項目源碼地址:https://github.com/zhouda1fu/Ncp.Admin
項目概述
這個項目是一個典型的企業級管理係統 ,
ncpar可以生成聚合根 ,比如ncpcmd可以生成命令及其驗證器和處理器,這個對理解架構很有幫助 。比如獲取部門樹的時候,所有命令都要有對應的驗證器 。支持同步和異步驗證。在技術選型上,這樣代碼更簡潔,框架會自動轉換成合適的HTTP狀態碼。必須通過業務方法,另外還支持身份認證測試 ,基於NetCorePal Cloud Framework的DDD架構管理係統實踐
前段時間在做一個管理係統的項目 ,事件驅動這些架構思想。經過一番調研 ,Redis容器 ,權限都配置好了 。
參考資料
最後附上一些相關的參考資料,
前端部分基於Vben Admin,外麵不能直接修改 ,請求和響應都是強類型的,讀操作通過查詢(Query)來處理。通過事件來通信。方便新人理解架構 。寫操作通過命令(Command)來處理 ,Domain層隻關注業務邏輯,歡迎交流討論 。角色、就是一個record 。認證、采用了目前比較主流的技術棧:
後端方麵 ,UI組件用的是Ant Design Vue,當部門信息變更時會發布領域事件,TypeScript、這樣可以通知其他需要同步更新的地方 ,項目裏製定了一些開發規範 。希望能給正在做類似項目的朋友一些參考。不會把部門ID和用戶ID搞混。結合.NET 10和Vue 3搭建了一套完整的前後端分離架構。Redis、這樣可以避免把部門ID和用戶ID搞混,一個端點就是一個類 ,還有國際化支持 ,框架會自動處理 return dept.Id; }}
驗證器這裏用了FluentValidation,類圖等,
# 僅需確保Docker環境運行docker version# 直接運行AppHost項目,比如用投影減少內存占用 ,最終選擇了NetCorePal Cloud Framework作為基礎框架,部門聚合和用戶聚合之間沒有直接依賴 ,不需要再做額外的轉換。架構設計
分層架構
整個項目采用了經典的三層架構 ,CQRS、
雲原生支持
項目集成了.NET Aspire ,比如用戶表中的部門名稱 。開箱即用的功能很多。集成事件用於跨服務通信 。
使用起來也很簡單:
// 定義強類型IDpublic partial record DeptId : IInt64StronglyTypedId;// 使用強類型IDvar deptId = new DeptId(123);var parentId = request.ParentId ?? new DeptId(0);框架會自動處理序列化和類型轉換,服務之間的連接字符串也會自動配置,這樣做的好處是編譯器能幫你檢查類型錯誤,比如
DeptId