跳到主要内容
版本: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:存放流程定义文件(如 .pfdFlowInfo.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)用于在应用层和客户端之间传递数据。MyEntityNameDtoMyEntityNameCreateDto 分别用于查询和创建操作。

API 接口实现

控制器提供标准的 CRUD RESTful API 接口。


常见问题排查

数据库迁移问题

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

依赖注入错误

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

API 无法访问

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

模块加载失败

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


性能考虑

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


总结

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

各模块职责明确:

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

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