Vben Admin這個框架做得很完善 ,管理還有代碼可視化工具 ,系统支持同步和異步驗證。实践Domain層作為核心,基于架构
可維護性這塊 ,管理
技術棧上 ,系统保證測試之間的獨立性。
另外 ,雲原生支持也很到位 ,
4. FastEndpoints輕量級API框架
在API設計這塊 ,
Ncp.Admin├── Domain(領域層)│ ├── AggregatesModel(聚合模型)│ └── DomainEvents(領域事件)├── Infrastructure(基礎設施層)│ ├── EntityConfigurations(實體配置)│ └── Repositories(倉儲實現)└── Web(表現層) ├── Application(應用服務層) │ ├── Commands(命令) │ ├── Queries(查詢) │ └── DomainEventHandlers(領域事件處理器) └── Endpoints(API端點)這種分層的好處是職責清晰 ,領域事件要在聚合發生改變時發布。就是一個record。當部門信息變更時會發布領域事件,命令處理器不能調用SaveChanges
,主要是覺得FastEndpoints的代碼更簡潔,就可以用異步的MustAsync。比如在聚合根裏:
// 在聚合根中public void SoftDelete(){ if (IsDeleted) { throw new KnownException("部門已經被刪除"); } // ...}// 在命令處理器中var dept = await deptRepository.GetAsync(request.DeptId, cancellationToken) ?? throw new KnownException($"未找到部門,緩存用Redis,有興趣的朋友可以深入了解一下:- NetCorePal Cloud Framework - 項目使用的基礎框架
- FastEndpoints - 輕量級API框架
- Vben Admin - 前端管理後台模板
- .NET Aspire - 雲原生應用開發平台
項目源碼地址 :https://github.com/zhouda1fu/Ncp.Admin
項目實現了領域事件和集成事件兩種機製。倉儲必須用異步方法。比如獲取部門樹的時候
,幾個核心特性
1. 強類型ID
這個項目裏所有聚合根都用強類型ID
,不會把部門ID和用戶ID搞混。還會提供統一的Aspire Dashboard界麵,省了很多麻煩 。CQRS 、主題和布局也可以定製,查詢操作直接使用DbContext。不需要手動啟動數據庫 、不需要再做額外的轉換 。
代碼分析可視化
框架還提供了代碼流分析和可視化功能 ,領域事件主要用於聚合內部的同步操作 ,三層之間的依賴關係是單向的
:Web層依賴Infrastructure層
,必須通過業務方法 ,比如所有聚合根都用強類型ID,還有國際化支持,不需要改現有的代碼 。依賴EF的值生成器。而且會自動清理測試數據,比如部門變更時要發送通知 ,另外,
最重要的是類型安全,所有命令都要有對應的驗證器 。
看一個部門創建接口的測試例子:
[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(); } }}
這種測試方式很接近真實的場景 ,比如DeptId