后端模板代码说明
CMS.Plugin.MyPluginName 是一个基于领域驱动设计(DDD)原则构建的 CMS 平台插件,旨在为 MyEntityName 实体提供完整的生命周期管理功能。该项目通过模块化架构实现了高内聚、低耦合的设计目标,支持在不同数据库环境(MySQL、PostgreSQL、SQL Server)下的灵活部署。
插件采用分层架构设计,包含表现层、应用层、领域层和基础设施层,确保了业务逻辑与技术实现的清晰分离。本项目不仅提供了基础的 CRUD 操作,还集成了流程处理、后台任务、事件处理等高级功能,适用于需要扩展 CMS 平台核心能力的企业级应用场景。
快速入门
创建新插件的完整流程
1. 克隆模板
复制整个模板目录,并重命名根文件夹为你的插件名称。
2. 替换占位符
全局搜索并替换以下占位符:
MyPluginName→ 你的插件名称(如:ProductCatalog)MyEntityName→ 你的实体名称(如:Product)
3. 重命名项目文件
相应地重命名所有包含占位符的 .csproj 文件和命名空间。
项目结构概览
该模板采用领域驱动设计(DDD)架构,包含多个分层模块:
- 应用层:处理业务逻辑和 API 暴露
- 领域层:定义核心实体和业务规则
- 基础设施层:负责数据持久化和外部集成
- 抽象层:提供共享接口和常量定义
核心组件分析
插件入口点 (CMSPluginEntry.cs)
这是插件的主入口,负责注册服务和配置依赖注入。
模块初始化 (CMSPluginModule.cs)
定义插件的模块依赖关系和后台作业配置。
数据库配置与初始化
数据库类型选择
在 CMSPluginEntry.cs 中通过配置决定使用哪种数据库:
配置文件详解
主配置文件 (appsettings.json)
位于主插件项目中,用于配置外部 API。
{
"IMyPluginNameExternalApi": {
"HttpHost": "http://127.0.0.1:18000/"
}
}
数据库连接配置
位于 EntityFrameworkCore 项目中,定义数据库连接字符串。
{
"ConnectionStrings": {
"Default": "Server=127.0.0.1;Database=CMS.Plugin.MyPluginName;User ID=root;Password=123456"
}
}
启动服务并验证
服务启动流程
API 可用性测试
使用 curl 命令测试基本功能:
# 获取列表
curl -X GET "http://localhost:5000/api/v1/MyPluginName/MyEntityName"
# 创建实体
curl -X POST "http://localhost:5000/api/v1/MyPluginName/MyEntityName" \
-H "Content-Type: application/json" \
-d '{"code":"P001","name":"测试产品"}'
目录结构说明
本项目采用基于领域驱动设计(DDD)的分层架构,结合插件化模块组织方式,结构清晰、职责分明。整体分为 src(源码)和 test(测试)两大目录,分别管理生产代码与测试代码。
主模块:CMS.Plugin.MyPluginName
CMS.Plugin.MyPluginName 是整个插件的主模块,负责集成所有分层组件并作为插件入口。它引用了应用层、数据访问层及数据库适配器模块,是运行时的启动点。
该模块包含以下关键子目录:
- Controller:提供 Web API 控制器,处理 HTTP 请求
- Apis:定义外部服务调用接口
- Jobs:后台作业定义,如定时任务
- Workers:后台工作服务
- FlowProcessors:流程处理器,用于业务 流程编排
- Flows:存放流程定义文件(如
.pfd和FlowInfo.xml) - Properties/launchSettings.json:开发环境启动配置
应用层:Application
CMS.Plugin.MyPluginName.Application 模块实现应用服务,负责协调领域对象完成业务用例。它依赖于领域层和应用契约层,是外部(如控制器)与领域模型之间的桥梁。
关键结构:
- Implements:应用服务的具体实现类
- MapperProfiles:AutoMapper 配置文件,用于 DTO 与领域实体之间的转换
领域层:Domain
CMS.Plugin.MyPluginName.Domain 是核心业务逻辑所在层,封装了领域模型、仓储接口、领域事件等。遵循 DDD 原则,该层不依赖任何外部框架或基础设施。
主要组成部分:
- MyEntityNames:包含实体
MyEntityName、仓储接口IMyEntityNameRepository及规范模式类 - Data:定义数据访问相关接口,如
ICMSPluginDapperRepository - EventHandlers:领域事件处理器
- Settings:设置定义提供者
领域共享层:Domain.Shared
CMS.Plugin.MyPluginName.Domain.Shared 模块存放跨层共享的常量、枚举、资源文件和基础 DTO(Eto),避免循环依赖。
核心内容包括:
- Enums:如
MyPluginNameStatus枚举,定义插件状态机 - Localization:多语言资源文件(
zh-Hans.json,en.json),支持国际化 - MyEntityNames:实体相关的常量定义(
MyEntityNameConsts)和事件传输对象(MyEntityNameEto)
数据持久化实现:EntityFrameworkCore
CMS.Plugin.MyPluginName.EntityFrameworkCore 模块提供基于 Entity Framework Core 的数据访问实现,包括 DbContext 和具体仓储。
主要职责:
- 实现
Domain层定义的仓储接口(如EfCoreMyEntityNameRepository) - 管理数据库上下文
ICMSPluginDbContext - 处理数据库模式迁移(
CMSPluginDbSchemaMigrator)
数据库适配器模块
项目提供了对多种数据库的支持,通过独立的适配器模块实现:
CMS.Plugin.MyPluginName.MySQLCMS.Plugin.MyPluginName.PostgreSqlCMS.Plugin.MyPluginName.SqlServer