跳到主要内容
版本:Next

后端模板代码说明

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.MySQL
  • CMS.Plugin.MyPluginName.PostgreSql
  • CMS.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 接口。


常见问题排查​

数据库迁移问题​

确保正确配置了数据库类型,并运行相应的 UpdateDB.bat 脚本。

依赖注入错误​

检查 CMSPluginEntry.cs 中的服务注册是否完整,特别是插件模块的添加。

API 无法访问​

验证路由配置是否正确,特别是版本号和控制器名称。

模块加载失败​

检查模块依赖关系、服务注册和数据库连接字符串配置。


性能考虑​

项目通过 ABP 框架的缓存机制和异步编程模型优化性能。领域层使用 AbpCachingModule 提供缓存支持,应用层通过 AddAutoMapperObjectMapper 优化对象映射性能。


总结​

本项目提供了一个基于领域驱动设计的 CMS 插件模板,支持多种功能和数据库适配。通过 ABP 框架的模块化设计,项目具有良好的可扩展性和维护性。

各模块职责明确:

  • 主模块:集成与启动
  • Application:应用服务协调
  • Domain:核心业务逻辑
  • EntityFrameworkCore:数据持久化
  • Application.Contracts:API 契约
  • Domain.Shared:跨层共享类型
  • 数据库适配器:多数据库支持
  • Abstractions:核心抽象定义

开发者可根据功能类型快速定位代码位置,理解分层意图,便于维护与扩展。