后端模板代码说明
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
每个适配器模块包含:
- 特定数据库的
CMSPluginDbContext实现 DbContextFactory用于设计时迁移- 对应的模块定义(如
CMSPluginMySQLModule) - 批处理脚本(
UpdateDB.bat,UpdateMigrations.bat)用于自动化数据库更新
应用契约:Application.Contracts
CMS.Plugin.MyPluginName.Application.Contracts 模块定义应用层的公共契约,包括:
- Dtos:数据传输对象,用于 API 输入输出
- Services:应用服务接口,供
Application层实现
抽象定义:Abstractions
CMS.Plugin.MyPluginName.Abstractions 模块提供插件级别的抽象定义,如:
IMyPluginNameFlowService:流程服务接口MyPluginNameActivity:活动定义基类
测试结构
test 目录下组织了分层测试项目:
- CMS.Plugin.MyPluginName.Application.Tests:应用层单元测试
- CMS.Plugin.MyPluginName.Domain.Tests:领域层单元测试
- CMS.Plugin.MyPluginName.EntityFrameworkCore.Tests:EF Core 集成测试
- CMS.Plugin.MyPluginName.TestBase:测试基类和共享测试数据
模块依赖关系
详细组件分析
应用服务分析
应用服务层通过 IMyEntityNameAppService 接口定义了对 MyEntityName 实体的 CRUD 操作。该接口位于 CMS.Plugin.MyPluginName.Application.Contracts 项目中,确保了服务契约的清晰定义。
领域实体分析
领域层中的 MyEntityName 实体定义了业务数据模型,包含属性和行为。该实体位于 CMS.Plugin.MyPluginName.Domain 项目中,是领域驱动设计的核心。
数据传输对象分析
数据传输对象(DTO)用于在应用层和客户端之间传递数据。MyEntityNameDto 和 MyEntityNameCreateDto 分别用于查询和创建操作。
API 接口实现
控制器提供标准的 CRUD RESTful API 接口。