流程引擎插件开发指南
1. 插件结构概述
Admin.NET 框架采用插件化架构,允许通过插件扩展系统功能。以审批流插件为例,插件的基本结构如下:
Admin.NET.Plugin.ApprovalFlow/
├── Configuration/ # 配置文件
├── Const/ # 常量定义
├── Entity/ # 实体类
├── Enum/ # 枚举定义
├── Middleware/ # 中间件
├── SeedData/ # 种子数据
├── Service/ # 服务层
│ ├── ApprovalFlow/ # 审批流服务
│ └── SysApproval/ # 系统审批服务
├── Admin.NET.Plugin.ApprovalFlow.csproj # 项目文件
├── GlobalUsings.cs # 全局使用
└── Startup.cs # 插件启动类2. 插件开发步骤
2.1 创建插件项目
- 创建项目:在
Admin.NET/Plugins目录下创建新的类库项目 - 命名规范:项目名称格式为
Admin.NET.Plugin.{插件名称} - 引用依赖:添加对
Admin.NET.Core的引用
2.2 配置启动类
每个插件必须包含一个启动类,用于注册服务和配置中间件:
csharp
[AppStartup(100)] // 启动顺序
public class Startup : AppStartup
{
public void ConfigureServices(IServiceCollection services)
{
// 注册服务
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// 配置中间件
app.UseApprovalFlow();
}
}2.3 实现核心功能
2.3.1 实体类定义
定义插件所需的实体类,如审批流、审批记录等:
csharp
[SugarTable("ApprovalFlow", "审批流")]
public partial class ApprovalFlow : EntityBase
{
/// <summary>
/// 流程编码
/// </summary>
public string Code { get; set; }
/// <summary>
/// 流程名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 流程配置
/// </summary>
public string FlowJson { get; set; }
/// <summary>
/// 表单配置
/// </summary>
public string FormJson { get; set; }
}2.3.2 服务层实现
实现插件的核心业务逻辑:
csharp
[ApiDescriptionSettings("ApprovalFlow", Order = 100)]
public class ApprovalFlowService : IDynamicApiController, ITransient
{
private readonly SqlSugarRepository<ApprovalFlow> _approvalFlowRep;
public ApprovalFlowService(SqlSugarRepository<ApprovalFlow> approvalFlowRep)
{
_approvalFlowRep = approvalFlowRep;
}
[ApiDescriptionSettings(Name = "Add"), HttpPost]
public async Task<long> Add(AddApprovalFlowInput input)
{
var entity = input.Adapt<ApprovalFlow>();
await _approvalFlowRep.InsertAsync(entity);
return entity.Id;
}
// 其他方法...
}2.3.3 中间件实现
通过中间件拦截请求,实现审批流程的匹配:
csharp
public class ApprovalFlowMiddleware
{
private readonly RequestDelegate _next;
private readonly SysApprovalService _sysApprovalService;
public ApprovalFlowMiddleware(RequestDelegate next)
{
_next = next;
_sysApprovalService = App.GetRequiredService<SysApprovalService>();
}
public async Task InvokeAsync(HttpContext context)
{
await _sysApprovalService.MatchApproval(context);
await _next(context);
}
}
public static class ApprovalFlowMiddlewareExtensions
{
public static IApplicationBuilder UseApprovalFlow(this IApplicationBuilder builder)
{
return builder.UseMiddleware<ApprovalFlowMiddleware>();
}
}2.3.4 种子数据
通过种子数据初始化插件所需的菜单、角色等:
csharp
public class SysMenuSeedData : ISqlSugarEntitySeedData<SysMenu>
{
public IEnumerable<SysMenu> HasData()
{
return new[]
{
new SysMenu{
Id=1310300010101,
Pid=1300300000101,
Title="审批流程",
Path="/platform/approvalFlow",
Name="approvalFlow",
Component="/approvalFlow/index",
Icon="ele-Help",
Type=MenuTypeEnum.Menu,
CreateTime=DateTime.Parse("2022-02-10 00:00:00"),
OrderNo=2000
},
};
}
}2.4 前端集成
在前端项目中添加插件的 API 调用和页面:
- API 定义:在
Web/src/api-plugins/approvalFlow目录下定义 API 接口 - 页面实现:在
Web/src/views/approvalFlow目录下实现前端页面 - 路由配置:在路由配置中添加插件页面路由
3. 插件配置
3.1 配置文件
在 Configuration 目录下创建插件配置文件:
json
{
"ApprovalFlow": {
"Enabled": true,
"ApiPath": "/api/approvalFlow",
"LogLevel": "Information"
}
}3.2 依赖注入
在 ConfigureServices 方法中注册插件服务:
csharp
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<ApprovalFlowService>();
services.AddScoped<SysApprovalService>();
}4. 插件集成测试
4.1 编译插件
- 编译插件项目:
dotnet build Admin.NET.Plugin.ApprovalFlow.csproj - 确保插件 DLL 被复制到主项目的输出目录
4.2 运行测试
- 启动主项目
- 访问插件功能,验证是否正常工作
- 测试插件的各项功能,如流程创建、审批等
5. 插件发布
5.1 打包插件
- 构建插件项目:
dotnet build -c Release - 打包插件 DLL 和配置文件
5.2 部署插件
- 将插件 DLL 复制到主项目的
Plugins目录 - 重启主项目,插件会自动加载
6. 其他插件示例
Admin.NET 框架还包含其他插件示例,可参考学习:
| 插件名称 | 功能描述 | 目录 |
|---|---|---|
| DingTalk | 钉钉集成 | Admin.NET.Plugin.DingTalk |
| GoView | 可视化构建工具集成 | Admin.NET.Plugin.GoView |
| K3Cloud | 金蝶K3 Cloud集成 | Admin.NET.Plugin.K3Cloud |
| Material | 物料管理 | Admin.NET.Plugin.Material |
| ReZero | Zero服务集成 | Admin.NET.Plugin.ReZero |
| WorkWeixin | 企业微信集成 | Admin.NET.Plugin.WorkWeixin |
7. 开发建议
- 模块化设计:将插件功能拆分为多个模块,便于维护
- 遵循框架规范:使用框架提供的特性和服务,保持代码风格一致
- 安全性:注意插件的安全性,避免引入安全漏洞
- 性能优化:合理使用缓存,优化数据库查询
- 文档完善:为插件编写详细的文档,方便其他开发者使用
8. 总结
通过插件化架构,Admin.NET 框架实现了功能的模块化和可扩展性。开发者可以通过创建插件来扩展系统功能,而无需修改核心代码。审批流插件作为一个典型示例,展示了如何从后端服务到前端页面的完整插件开发流程。
插件开发不仅可以满足特定业务需求,还可以促进代码复用和社区协作,为框架的生态建设做出贡献。