bestofrs.org! DDD? Rust? WebAssembly?—— 纯血Rust最佳实践齐打交!

张开发
2026/4/4 18:18:34 15 分钟阅读
bestofrs.org! DDD? Rust? WebAssembly?—— 纯血Rust最佳实践齐打交!
开门见山这是我开源的绣化版本bestofjs——Best of RS!Github: https://github.com/zhiyanzhaijie/bestofrs官网: https://bestofrs.org已上线稳定运行一个多月目前文档、CI齐全所以各平台做下宣传。Preview预览架构介绍一个基于 Rust 的Clean Hexagonal Doamin Driven Design架构, 结合dioxus全栈。Notice: 本文档所用图表均由Excalidraw绘制, 在此鸣谢。Clean 架构先看项目分层crates/ - adapters/# Clean Core- app/# Clean Core- domain/# Clean Core- infra/# Clean Core- ui/# User Interface- worker/# User Interface本项目架构参考 axum-clean-architecture by Thodin并结合了 Dioxus fullstack 的工程实践。核心依赖方向domain - app(application) - adapter - infra(infrastructure) - user interfaceClean CoreDDD核心1. Domain Layercrates/domain/srcTree图crates/domain/src ├── auth ├── error.rs ├── lib.rs ├── project ├── repo └── snapshotLayer 构成与职责auth / project / repo / snapshot按业务子域划分的领域模型error.rs领域级错误语义lib.rs领域模块导出边界Domain层承载领域语义与业务不变式只关心领域建模不关心业务编排与技术实现。典型单元以project为例crates/domain/src/project ├── entity.rs(实体)├── event.rs(领域事件)├── mod.rs └── value_object.rs(值对象)2. Application Layercrates/app/srcTree图crates/app/src ├── app_error.rs ├── auth ├── backup ├── common ├── lib.rs ├── prelude.rs ├── project ├── repo └── snapshotLayer 构成与职责common、app_error.rs跨 use case 的通用业务逻辑与统一错误语义auth / backup / project / repo / snapshot不同领域用例use cases模块prelude.rs应用层常用导出Application层负责业务编排Use Cases通过端口抽象依赖外部能力不直接依赖具体基础设施实现。典型单元以project为例crates/app/src/project ├── command.rs(CQRS - read用例)├── event_handler.rs(领域事件驱动编排)├── impls(充血模型实现Rich Domain Model)├── mod.rs ├── port.rs(Hexagonal Port)└── query.rs(查询用例)3. Adapter Layercrates/adapters/srccrates/ui/src/IOTree图crates/adapters/src ├── auth ├── clock.rs ├── github.rs ├── lib.rs ├── persistence └── prelude.rsLayer 构成与职责persistence存储适配实现auth鉴权/授权相关适配github.rs外部 API 适配clock.rs时间能力适配Adapter层负责技术编排与边界转换把Application ports落地为具体实现。补充HTTP endpoint 的实现代码位于crates/ui/src/IO。这是“物理位置在ui逻辑归属在Adapter”的工程布局。典型单元以persistence/psql为例crates/adapters/src/persistence/psql ├── backup.rs(数据备份实现)├── db.rs(数据库连接实现)├── mod.rs ├── project_repo.rs(Project 仓储实现)├── repo_repo.rs(Repo 仓储实现)├── repo_tag_repo.rs(Tag 仓储实现)├── runtime.rs(运行时装配)└── snapshot_repo.rs(Snapshot 仓储实现)4. Infrastructure Layercrates/infra/srcTree图crates/infra/src ├── config ├── lib.rs └── setup.rsLayer 构成与职责config配置模型与配置来源setup.rs装配入口负责初始化与依赖注入lib.rs基础设施模块导出Infrastructure层只做系统装配与启动准备不承载业务规则。典型单元以config为例crates/infra/src/config ├── mod.rs(配置模块导出)├── settings.rs(配置结构定义)└── toml(环境配置文件目录)User Interface表现层Worker与UI同属User Interface但交互对象不同UI面向用户交互界面Worker面向任务调度与后台执行1. UI cratecrates/ui/srcTree图crates/ui/src ├── IO ├── components ├── impls ├── js ├── lib.rs ├── main.rs ├── root └── types内容-main.rsUI/Web 入口与服务启动入口fullstack -root页面布局与Router -components可复用 UI 组件目前出于KISS原则考虑我将页面组件也放入其中受影响于Next.js的App Router组织风格 -types前端viewmodel数据结构 -impls / js前端侧实现细节NoticeIO目录虽物理上位于ui但本质逻辑为HTTP endpoint adapter的axum实现,在架构归属上属于Adapter。参考下图SSR Fullstack的核心Dioxus v0.7.0 版本提供了非常便捷的#[post], #[get]等宏这些宏在提供无缝的fullstack体验的前提下又保证了代码整洁。具体的Fullstack原理请参考Dioxus官方文档。为了更优雅的SSR实现我根据以往的前端工程经验创建了面向复杂ui组件的mod-like样板crates/ui/src/components/**/exampleComp/ ├── mod.rs#组件├── skeleton.rs#loading fallback├── error.rs#错误fallback├── hook.rs#私有hook├── context.rs#私有context├── style.css#若tailwind样式不便├──(optional)sub-Comp/#若有子组件则样板递归并封装IOCell组件收敛ssr处理逻辑。还有最简单的纯组件样板compName.rs, 这个没有特别点不做展开。2. Worker cratecrates/worker/srcTree图crates/worker/src └── main.rs内容依赖core层功能的快捷应用当前仅使用到snapshot领域下一个小的快照功能。略。为什么做 Best Of RS作者本身于bestofjs.org受益良多在写rust的时候一直想想着想着就有个这么个点子离职期间想挖掘下Dioxus的潜力落地一下DDD, 一拍即合所以Best Of RS出来了PS求个请github邮箱联系~♥️为什么宣传求Stars要饭普及DDD cleanDDD普及Rust Dioxus WASM欢迎使用Best Of RS 如果有所帮助, Star秋梨膏Orz!!!

更多文章