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

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

项目概述

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

技术栈亮点

后端技术栈

  • 核心框架: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快捷键可以快速生成一个完整的垂直切片实现,包含请求、响应、验证器和处理器。

代码分析可视化

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

# 安装全局工具
dotnet tool install -g NetCorePal.Extensions.CodeAnalysis.Tools # 生成可视化文件
cd src/Ncp.CleanDDD.Web
netcorepal-codeanalysis generate --output architecture.html

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

快速开始

环境准备

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

# 启动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:

# 安装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构建,启动步骤:

# 进入前端目录
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项目模板,不妨试试Ncp.CleanDDD,相信它会给你带来惊喜!

DDD架构模板:Ncp.CleanDDD的更多相关文章

  1. 分布式抽奖秒杀系统,DDD架构设计和实现分享

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.用大项目,贯穿知识体系 写CRUD.堆API.改屎山⛰,熬多少个996也只是成为重复的螺丝 ...

  2. 单元测试布道二:在全新的 DDD 架构上进行单元测试

    目录 回顾 dotnet 单元测试相关的工具和知识 可测试性 不确定性/未决行为 依赖于实现:不可 mock 复杂继承/高耦合代码:测试困难 实战:在全新的 DDD 架构上进行单元测试 需求-迭代1: ...

  3. DDD架构中的领域是什么?

    DDD架构中的领域是什么? ​ 我们经常说到DDD分层架构(领域驱动设计),那么究竟什么是DDD架构?如果去网上查通常会告诉你告诉你区别于过去的三层架构思想,DDD(领域驱动设计)是一种四层架构,一般 ...

  4. ddd 架构设计——abp

    一.为什么要分层 分层架构是所有架构的鼻祖,分层的作用就是隔离,不过,我们有时候有个误解,就是把层和程序集对应起来,就比如简单三层架构中,在你的解决方案中,一般会有三个程序集项目:XXUI.dll.X ...

  5. 分享一套Code Smith 搭建N层架构模板

    开篇 平常开发时,由于冗余代码过多,程序员做重复的工作过多势必会影响开发效率.倘若 对重复性代码简单的复制.粘贴,虽然也能节省时间,但也需仔细一步步替换,这无疑也是一件费力的事.这时我们急需代码生成工 ...

  6. 怎么说服领导,能让我用DDD架构肝项目?

    作者:小傅哥 博客:https://bugstack.cn 原文:https://mp.weixin.qq.com/s/ezd-6xkRiNfPH1lGwhLd8Q 沉淀.分享.成长,让自己和他人都能 ...

  7. DDD架构Sample

    http://dddsamplenet.codeplex.com/SourceControl/latest#DDDSample-Vanilla/Application/IBookingService. ...

  8. DDD~DDD从零起步架构说明

    回到目录 看了传说中的弦哥对园子里.Net项目分层与文件夹结构大全(最佳架子奖,吐槽奖,阴沟翻船奖揭晓),我也来说说我的DDD架构吧,主要是看了微软NlayerApp之后,自己写的一个,以后将会应用到 ...

  9. 从MVC到DDD的架构演进

    DDD这几年越来越火,资料也很多,大部分的资料都偏向于理论介绍,有给出的代码与传统MVC的三层架构差异较大,再加上大量的新概念很容易让初学者望而却步.本文从MVC架构角度来讲解如何演进到DDD架构. ...

  10. DDD/CQRS模式,微服务,容器

    DDD/CQRS模式,微服务,容器 https://docs.microsoft.com/zh-cn/previous-versions/msp-n-p/ee658109(v=pandp.10) We ...

随机推荐

  1. ArcObejcts SDK 020 开发框架搭建-架构设计

    1.技术选型 ArcObjects SDK 10.8(ArcGIS 10.8),.Net FrameWork 4.8,VS2022,WPF(WinForm).DEV. 用的时候,打包的ArcObjec ...

  2. 大模型学习笔记(一)—— transformer

    写在前面,一定要看懂self attention的代码实现,注意矩阵乘是谁@谁,矩阵乘不可以变换位置!!! Attention的出现 由于翻译任务往往不是1 vs 1的翻译,因此输入与输出不等长,所以 ...

  3. 10-2 MySQL 索引优化与查询优化

    10-2 MySQL 索引优化与查询优化 @[toc] 这篇文章是我蹲在<尚硅谷>-康师傅博主家的 WiFi 上(不是),连夜 Ctrl+C / V 俩的镇站神文. 这篇转载只是为了,跟大 ...

  4. Set 的各个实现类的性能分析

    HashSet 和TreeSet是Set的典型实现.HashSet 比TreeSet性能好,TreeSet需要额外通过红黑树算法维护集合 的顺序.除了需要维护集合的顺序外,其他的都优先用HashSet ...

  5. 3.Java Spring框架源码分析-AOP-AnnotationAwareAspectJAutoProxyCreator是在什么时候起作用的

    目录 1. 继续研究BeanPostProcessor的postProcessBeforeInstantiation和postProcessAfterInitialization 2. 创建其他单实例 ...

  6. 2023 syzx 春季训练 1

    得找个时间把 zr 题补补.. A 考虑 \(f_{i}\) 只能拆为 \(f_{i-1}+f_{i-2}\),考虑拆 \(f_{i-1}=f_{i-2}+f_{i-3}\) 时,这条 \(f_{i- ...

  7. C# 添加一个具有自定义命名空间和相同类名的静态类:Console

    using CLRConsole = System.Console; namespace ExtensionMethodsDemo { public static class Console { pu ...

  8. C# DateTime时间戳帮助类型

    https://www.cnblogs.com/minotauros/p/10773258.html /// <summary> /// 时间工具类 /// </summary> ...

  9. vuepress2.x集成评论插件

    这是官方文档 这是效果 开通Giscus Giscus是github的一个功能,用了专门存放评论的功能.需要依托一个仓库. 我这里就拿我这个当前vuepress项目开开通. Settings>F ...

  10. 企业API网关适用业务场景

    什么是企业级API网关 企业级API网关是一种用于管理.保护和监控企业内部和外部API(Application Programming Interface)的解决方案.它提供了一套统一的接入点,帮助企 ...