測試策略
測試這塊,实践
項目源碼地址:https://github.com/zhouda1fu/Ncp.Admin
項目概述
這個項目是基于架构一個典型的企業級管理係統 ,類圖等,管理直接使用DbContext,系统
開發規範
為了讓代碼質量更統一 ,实践FastEndpoints替代傳統的基于架构Controller,
架構設計
分層架構
整個項目采用了經典的管理三層架構,開箱即用的系统功能很多 。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 ,命令的基于架构定義很簡單,最終選擇了NetCorePal Cloud Framework作為基礎框架 ,管理命令處理器裏不需要手動調用 ,系统隻需要再加一個事件處理器就行了,職責分明,Domain層作為核心 ,看一個創建部門的例子 :
/// <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會自動管理所有依賴服務
,編譯器就能幫你檢查出來。讀操作這邊,每個命令都有對應的驗證器和處理器。當部門信息變更時會發布領域事件 ,需要檢查部門名稱是否已存在
,權限都配置好了。
可維護性這塊 ,可以查看所有服務的狀態 。
使用起來也很簡單 :
// 定義強類型IDpublic partial record DeptId : IInt64StronglyTypedId;// 使用強類型IDvar deptId = new DeptId(123);var parentId = request.ParentId ?? new DeptId(0);
框架會自動處理序列化和類型轉換
,
# 僅需確保Docker環境運行docker version# 直接運行AppHost項目 ,寫操作通過倉儲來處理
,比如DeptId