DDD架构模板:Ncp.CleanDDD

一个优雅的DDD架构模板:Ncp.CleanDDD

在现代软件开发中,领域驱动设计(DDD)越来越受到开发者的青睐,但搭建一个规范的DDD项目结构往往需要耗费大量时间。今天给大家推荐一个我最近发现的优秀DDD架构模板------Ncp.CleanDDD,它基于.NET生态系统构建,提供了完整的领域驱动设计实现方案。

项目概述

Ncp.CleanDDD是一个遵循DDD原则的项目模板,它整合了多个优秀的开源框架,为开发者提供了一套开箱即用的企业级应用开发方案。该模板不仅包含了后端服务架构,还提供了配套的前端管理系统,形成了一个完整的解决方案。

项目地址:https://github.com/zhouda1fu/Ncp.CleanDDD

技术栈亮点

后端技术栈

  • 核心框架ASP.NET Core
  • 领域驱动设计支持:基于NetCorePal Cloud Framework
  • 数据访问:Entity Framework Core
  • 消息队列:CAP(事件总线)
  • 命令查询分离:MediatR
  • 验证:FluentValidation
  • API文档:Swashbuckle.AspNetCore.Swagger

前端技术栈

  • 框架:Vue 3 + TypeScript
  • UI组件库:Element Plus
  • 路由:Vue Router
  • 状态管理:Pinia
  • HTTP客户端:Axios
  • 构建工具:Vite

项目结构

Ncp.CleanDDD采用严格的分层架构,遵循依赖倒置原则,各层之间保持清晰的边界:

复制代码
Ncp.CleanDDD.sln
├── src/
│   ├── Ncp.CleanDDD.Domain/         # 领域层 - 聚合根、实体、领域事件
│   ├── Ncp.CleanDDD.Infrastructure/ # 基础设施层 - EF配置、仓储实现
│   └── Ncp.CleanDDD.Web/           # 表现层 - API、应用服务
└── test/                            # 测试项目
    ├── Ncp.CleanDDD.Domain.Tests/
    ├── Ncp.CleanDDD.Infrastructure.Tests/
    └── Ncp.CleanDDD.Web.Tests/

分层依赖关系严格遵循:Web → Infrastructure → Domain的单向依赖,确保领域层的纯粹性。

开发效率工具

代码片段

模板提供了丰富的代码片段,支持多种IDE,包括Visual Studio、VS Code和JetBrains Rider,能极大提高开发效率。常用的代码片段包括:

  • 领域层:聚合根(ncpar)、领域事件(ncpde)、仓储接口(ncprepo)
  • 应用层:命令(ncpcmd)、命令(含返回值)(ncpcmdres)、集成事件(ncpie)
  • 表现层:FastEndpoint相关片段(epp、epreq、epres等)

例如,使用epp快捷键可以快速生成一个完整的垂直切片实现,包含请求、响应、验证器和处理器。

代码分析可视化

一个非常有特色的功能是代码分析可视化工具,它能自动分析代码结构并生成交互式图表:

bash 复制代码
# 安装全局工具
dotnet tool install -g NetCorePal.Extensions.CodeAnalysis.Tools

# 生成可视化文件
cd src/Ncp.CleanDDD.Web
netcorepal-codeanalysis generate --output architecture.html

生成的HTML页面包含多种图表类型,如架构流程图、命令链路图、事件流程图等,支持在线编辑和导出,帮助团队更好地理解系统结构。

快速开始

环境准备

项目依赖MySQL、RabbitMQ和Redis,可通过Docker快速部署:

bash 复制代码
# 启动MySQL
docker run --restart always --name mysql -v /mnt/d/docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:latest

# 启动RabbitMQ
docker run --restart always -d --hostname node1 --name rabbitmq -p 15672:15672 -p 5672:5672 rabbitmq:3-management

# 启动Redis
docker run --restart always --name redis -v /mnt/d/docker/redis:/data -p 6379:6379 -d redis:5.0.7 redis-server

数据库迁移

使用EF Core的迁移工具管理数据库 schema:

bash 复制代码
# 安装EF工具
dotnet tool install --global dotnet-ef --version 9.0.0

# 创建迁移
dotnet ef migrations add InitialCreate -p src/Ncp.CleanDDD.Infrastructure 

# 更新数据库
dotnet ef database update -p src/Ncp.CleanDDD.Infrastructure 

前端启动

前端项目基于Vue 3构建,启动步骤:

bash 复制代码
# 进入前端目录
cd frontend

# 安装依赖
npm install

# 启动开发服务器
npm run dev

最佳实践

Ncp.CleanDDD内置了大量最佳实践,包括:

  1. 领域事件与集成事件分离:清晰区分领域内事件和跨服务事件
  2. 命令查询职责分离(CQRS):通过MediatR实现命令和查询的分离处理
  3. 仓储模式:抽象数据访问层,隔离领域层与数据访问细节
  4. 严格的单元测试规范:遵循AAA模式(Arrange、Act、Assert),确保领域逻辑正确性
  5. API端点设计:使用FastEndpoints替代传统MVC Controller,提供更好的性能

监控集成

项目集成了prometheus-net,默认通过/metrics地址输出监控指标,方便与Prometheus等监控系统集成,实现对系统运行状态的实时监控。

总结

Ncp.CleanDDD为开发者提供了一个规范、高效的DDD项目模板,它不仅包含了完整的架构设计,还提供了丰富的工具和最佳实践,能帮助团队快速上手领域驱动设计,减少重复工作,专注于业务逻辑的实现。

无论是新启动的企业级应用,还是现有项目的架构重构,Ncp.CleanDDD都是一个值得考虑的优秀选择。

如果你对DDD感兴趣,或者正在寻找一个成熟的.NET项目模板,不妨访问项目地址https://github.com/zhouda1fu/Ncp.CleanDDD,相信它会给你带来惊喜!