[分享] 一款基于 NestJS 的 DDD 脚手架,开箱即用,助你快手上手 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
如果想在 V2EX 获得更好的推广效果,欢迎了解 PRO 会员机制:
pro/about
jarryli

[分享] 一款基于 NestJS 的 DDD 脚手架,开箱即用,助你快手上手

  •  
  •   jarryli 1 天前 250 次点击

    一款基于 NestJS 的 DDD 脚手架,开箱即用,供需要的人参考

    一个基于 NestJS 10 + TypeORM 的领域驱动设计( DDD ) Node.js 脚手架,内置双数据库、领域事件、统一响应、Swagger 文档与 Docker 一键启动示例。

    这是什么

    nestjs-ddd 是一个面向 Node.js / TypeScript 的 DDD 工程脚手架,帮你用几分钟时间搭好一个符合 DDD 分层规范的后端服务。

    项目内置 用户( User )订单( Order ) 两个示例聚合,用户库走 MySQL 、订单库走 PostgreSQL ,包含 15 个 REST 接口、领域事件发布与监听、Swagger 文档、Docker Compose 一键启动。

    功能与 gin-ddd / springboot4ddd 对齐,便于对比不同语言栈在 DDD 工程中的落地差异。

    关注点 约束
    接口层 HTTP 协议适配( VO / 路由 / 过滤器) 不写业务逻辑
    应用层 用例编排、事务、DTO / Command 只依赖领域层
    领域层 业务规则、聚合、领域事件、仓储接口 零框架依赖
    基础设施层 TypeORM 、消息、邮件等技术实现 向上实现领域接口

    一句话:MVC 按技术切,DDD 按业务切。业务越复杂,DDD 的价值越明显。

    为什么 Node.js 也要用 DDD ?

    有人会觉得:Node.js 是不是写写脚本、BFF 就够了,没必要用 DDD ?

    结论很简单:用不用 DDD 和语言无关,和业务复杂度有关。

    • 小项目:NestJS 默认的 Module / Controller / Service 三件套就够用,没必要上 DDD 。
    • 中大型项目(模块超过 10 个、接口超过 50 个、业务规则密集),很容易出现:
      • Service 越写越臃肿,一个方法里掺杂参数校验、业务规则、事务、事件、ORM 细节;
      • 对象退化成只有 getter/setter 的"贫血模型",业务散落在各个 Service ;
      • 新来的人看不懂代码结构在表达什么业务。
    • 这时候用 DDD 就能把代码按业务语义重新切清楚
      • 聚合根 持有业务规则,不再被 Service 侵蚀;
      • 应用服务 只负责编排和事务,职责非常薄;
      • 仓储接口 + 依赖倒置 让领域层完全独立于数据库/框架。
    • TypeScript + NestJS 特别适合落地 DDD:强类型表达值对象/聚合,装饰器 + DI 天然契合依赖倒置,几乎不用造轮子。

    本仓库专注于设计模式与架构

    https://github.com/microwind/design-patterns

    目前尚无回复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2437 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 00:02 PVG 08:02 LAX 17:02 JFK 20:02
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86