|
基本的基于架构管理後台需求都能滿足。RabbitMQ這些。管理Name={ d.Name}"); RuleFor(d => d.Status).InclusiveBetween(0,系统 1).WithMessage("狀態值必須為0或1"); }}/// <summary>/// 命令處理器/// </summary>public class CreateDeptCommandHandler(IDeptRepository deptRepository) : ICommandHandler<CreateDeptCommand, DeptId>{ public async Task<DeptId> Handle(CreateDeptCommand request, CancellationToken cancellationToken) { var parentId = request.ParentId ?? new DeptId(0); var dept = new Dept(request.Name, request.Remark, parentId, request.Status); await deptRepository.AddAsync(dept, cancellationToken); // 注意
:不需要手動調用SaveChanges
,使用.NET 10作為主要框架
,实践項目裏製定了一些開發規範
。基于架构這樣開發效率會高不少。管理 寫操作這邊,系统集成測試用了Aspire來自動管理測試環境。实践其次是基于架构屬性都用private set ,一個端點就是管理一個類,還有代碼可視化工具
,系统查詢操作直接使用DbContext 。实践可以直觀地看到代碼之間的基于架构關係和數據流向
。Redis這些基礎設施,管理而且可以針對不同的系统場景做優化 。類型安全有保障。或者想了解DDD在實際項目中的應用
,都是目前比較主流的技術。部門等基礎功能模塊。這個結構應該很多做DDD的朋友都比較熟悉。前後端都用了TypeScript,首先是強類型ID , 雲原生支持項目集成了.NET Aspire,Vite、比如權限控製
,性能也更好 。不會把部門ID和用戶ID搞混。而且不手動賦值ID,在技術選型上,可以看看這個項目的代碼 , 2. 倉儲模式倉儲這塊,比如所有聚合根都用強類型ID, 前端架構前端用的是Vben Admin這個模板
,職責分明
,Domain層作為核心,項目實現了領域事件和集成事件兩種機製。這是一個基於Vue 3的管理後台框架
。這個對理解架構很有幫助 。不需要啟動HTTP服務器,CQRS
、希望能給正在做類似項目的朋友一些參考。一個類就把路由 、保證測試之間的獨立性。可以模擬登錄用戶的各種操作。不需要再做額外的轉換。 如果你也在做類似的管理係統,事件流程圖 、MediatR實現CQRS模式。Web層處理HTTP請求和響應。所有命令都要有對應的驗證器。比如獲取部門樹的時候
,應該能有一些參考價值 。命令鏈路圖、也不容易出錯。框架會自動轉換成合適的HTTP狀態碼
。還會提供統一的Aspire Dashboard界麵 ,就是一個record
。自動化工具,這是一個非常優秀的Vue 3 + TypeScript + Vite的管理後台模板 , 4. FastEndpoints輕量級API框架在API設計這塊, 2. CQRS模式(命令查詢職責分離)CQRS在這個項目中主要體現在讀寫分離上。項目地址在https://github.com/zhouda1fu/Ncp.Admin ,結合.NET 10和Vue 3搭建了一套完整的前後端分離架構。寫操作通過倉儲來處理,配合EF Core做數據訪問,而不會影響寫操作的邏輯
。 3. 驗證機製驗證用的是FluentValidation,狀態隻能通過業務方法來修改 。Ant Design Vue,支持路由權限和按鈕權限 ,DDD主要體現在聚合根的設計上
。代碼組織得也比較規範 。請求和響應都是強類型的,Redis、這個功能真的很方便
。Domain層隻關注業務邏輯 , 核心設計模式1. 領域驅動設計(DDD)在這個項目中, 基於NetCorePal Cloud Framework的DDD架構管理係統實踐前段時間在做一個管理係統的項目 , 讀操作這邊,每個聚合根都有自己的業務邊界,看一個創建部門的例子: /// <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 => $"該部門已存在
,比如在聚合根裏:// 在聚合根中public void SoftDelete(){ if (IsDeleted) { throw new KnownException("部門已經被刪除"); } // ...}// 在命令處理器中var dept = await deptRepository.GetAsync(request.DeptId, cancellationToken) ?? throw new KnownException($"未找到部門 ,整體架構清晰,開發效率還可以。另外還支持身份認證測試 ,部門聚合和用戶聚合之間沒有直接依賴
,不需要改現有的代碼。包含了用戶 、前端用Vue 3 + TypeScript + Vite
,使用起來也很簡單: // 定義強類型IDpublic partial record DeptId : IInt64StronglyTypedId;// 使用強類型IDvar deptId = new DeptId(123);var parentId = request.ParentId ?? new DeptId(0);
框架會自動處理序列化和類型轉換,就可以用異步的MustAsync
。這樣做的好處是不用手動搭建測試數據庫、業務異常用KnownException處理 。 看一個部門創建接口的測試例子: [Collection(WebAppTestCollection.Name)]public class DeptTests(WebAppFixture app) : AuthenticatedTestBase<WebAppFixture>(app){ [Fact] public async Task CreateDept_WithValidData_ShouldSucceed() { // Arrange var client = await GetAuthenticatedClientAsync(); var deptName = $"測試部門_{ Guid.NewGuid():N}"; try { // Act var request = new CreateDeptRequest(deptName, "測試備注", null, 1); var (response, result) = await client.POSTAsync< CreateDeptEndpoint, CreateDeptRequest, ResponseData<CreateDeptResponse>>(request); // Assert Assert.True(response.IsSuccessStatusCode); Assert.NotNull(result?.Data); Assert.Equal(deptName, result.Data.Name); } finally { await CleanupTestDataAsync(); } }}
這種測試方式很接近真實的場景,展示了如何在.NET 10生態中應用DDD、編譯器就能幫你檢查出來 。這樣可以通知其他需要同步更新的地方, 比如說
,領域事件主要用於聚合內部的同步操作,而不是直接用long或int
|