探索 DoraCMS 的架构设计:从 Repository 模式到双数据库支持
在 Node.js CMS 领域,如何设计一个既灵活又易维护的架构一直是个挑战。最近在研究 DoraCMS 的架构设计时,发现了一些值得分享的设计思路,特别是其 Repository 模式和双数据库支持的实现方式。
架构概览
DoraCMS 采用了前后端分离的现代化架构,整体分为四层:
前端应用层 → API 网关层 → 应用服务层 → 数据存储层
后端采用 EggJS 框架,遵循 Controller → Service → Repository 三层架构,职责清晰,易于维护。
核心设计:Repository 模式
为什么需要 Repository 模式?
在传统的 MVC 架构中,业务代码往往直接操作数据库模型,这会导致几个问题:
- 数据库耦合:切换数据库需要重写大量查询代码
- 代码分散:查询逻辑散布在各个 Service 中,难以复用
- 维护困难:相同的数据操作逻辑在多处重复
DoraCMS 通过 Repository 模式解决了这些问题。Repository 层作为数据访问的抽象层,提供了统一的查询接口,屏蔽了底层数据库的差异。
四层继承结构
DoraCMS 的 Repository 采用了四层继承结构:
scss
IBaseRepository (接口层)
↓
BaseStandardRepository (跨数据库基类)
↓ ↓
BaseMongoRepository BaseMariaRepository
↓ ↓
UserMongoRepository UserMariaRepository
这种设计的巧妙之处在于:
- BaseStandardRepository 实现了通用的 CRUD 操作和统一的参数接口
- BaseMongoRepository 和 BaseMariaRepository 分别实现数据库特定的查询转换
- 具体的 Repository 只需要实现业务特定的逻辑
统一的参数接口
无论使用 MongoDB 还是 MariaDB,业务代码都使用相同的查询方式:
javascript
// 统一的查询接口
const users = await userRepository.findMany({
filters: { status: "active" },
populate: ["role", "department"],
sort: { createdAt: -1 },
pagination: { page: 1, limit: 20 },
});
Repository 内部会根据数据库类型自动转换查询参数,业务层完全无感知。
双数据库支持
这是 DoraCMS 的一个亮点特性。通过 Repository 模式的抽象,实现了 MongoDB 和 MariaDB 的无缝切换。
切换方式
只需要在配置文件中修改一行代码:
javascript
// config.js
config.dbType = "mongodb"; // 或 'mariadb'
业务代码完全不需要修改,这得益于 Repository 层的抽象和 Adapter 适配器模式。
技术实现
- MongoDB:使用 Mongoose 作为 ODM
- MariaDB:使用 Sequelize 作为 ORM
- Adapter 层:负责查询参数的转换和结果映射
这种设计让开发者可以根据项目需求灵活选择数据库,而不需要重写业务代码。
三层架构的职责划分
Controller 层
负责处理 HTTP 请求和响应:
- 参数验证
- 权限检查
- 调用 Service 层
- 格式化响应
Service 层
负责业务逻辑编排:
- 业务规则验证
- 事务管理
- 调用 Repository 进行数据操作
- 跨模块协调
Repository 层
负责数据访问:
- 数据库 CRUD 操作
- 查询转换和优化
- 异常处理
- 字段映射
这种清晰的职责划分让代码结构更加清晰,也更容易进行单元测试。
微前端架构
DoraCMS 还支持微前端架构,基于 qiankun 框架实现。主应用可以注册多个子应用,每个子应用可以独立开发、部署和升级。
这种架构特别适合大型项目,可以让不同团队独立负责不同的前端应用,提高开发效率。
技术栈
前端
- Vue 3 + TypeScript
- Vite 构建工具
- Element Plus UI 组件库
- UnoCSS 原子化 CSS
后端
- EggJS 3.x 企业级框架
- MongoDB / MariaDB 双数据库支持
- Redis 缓存
- JWT 认证
设计亮点总结
- Repository 模式:实现了数据访问层的抽象,代码复用率可达 90%+
- 双数据库支持:通过配置即可切换数据库,业务代码零修改
- 三层架构:职责清晰,易于维护和扩展
- 微前端支持:适合大型项目的模块化开发
- 类型安全:TypeScript 全面支持,减少运行时错误
思考与启发
DoraCMS 的架构设计给我最大的启发是:通过合理的抽象层设计,可以在保持灵活性的同时,降低代码复杂度。
Repository 模式虽然增加了代码层次,但带来的好处是显而易见的:
- 业务代码与数据库解耦
- 查询逻辑统一封装
- 易于测试和维护
- 支持多数据库切换
这种设计思路值得在类似项目中借鉴。
总结
DoraCMS 的架构设计体现了对代码质量和可维护性的重视。通过 Repository 模式、三层架构和双数据库支持,它提供了一个既灵活又易用的 CMS 解决方案。
如果你对 Node.js CMS 架构设计感兴趣,或者正在寻找一个可扩展的内容管理系统,不妨了解一下 DoraCMS 的设计思路。
相关链接:
- GitHub 仓库:github.com/doramart/Do...
- 官方网站:www.doracms.net