Skip to content

流程引擎插件开发指南

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 创建插件项目

  1. 创建项目:在 Admin.NET/Plugins 目录下创建新的类库项目
  2. 命名规范:项目名称格式为 Admin.NET.Plugin.{插件名称}
  3. 引用依赖:添加对 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 调用和页面:

  1. API 定义:在 Web/src/api-plugins/approvalFlow 目录下定义 API 接口
  2. 页面实现:在 Web/src/views/approvalFlow 目录下实现前端页面
  3. 路由配置:在路由配置中添加插件页面路由

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 编译插件

  1. 编译插件项目:dotnet build Admin.NET.Plugin.ApprovalFlow.csproj
  2. 确保插件 DLL 被复制到主项目的输出目录

4.2 运行测试

  1. 启动主项目
  2. 访问插件功能,验证是否正常工作
  3. 测试插件的各项功能,如流程创建、审批等

5. 插件发布

5.1 打包插件

  1. 构建插件项目:dotnet build -c Release
  2. 打包插件 DLL 和配置文件

5.2 部署插件

  1. 将插件 DLL 复制到主项目的 Plugins 目录
  2. 重启主项目,插件会自动加载

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
ReZeroZero服务集成Admin.NET.Plugin.ReZero
WorkWeixin企业微信集成Admin.NET.Plugin.WorkWeixin

7. 开发建议

  1. 模块化设计:将插件功能拆分为多个模块,便于维护
  2. 遵循框架规范:使用框架提供的特性和服务,保持代码风格一致
  3. 安全性:注意插件的安全性,避免引入安全漏洞
  4. 性能优化:合理使用缓存,优化数据库查询
  5. 文档完善:为插件编写详细的文档,方便其他开发者使用

8. 总结

通过插件化架构,Admin.NET 框架实现了功能的模块化和可扩展性。开发者可以通过创建插件来扩展系统功能,而无需修改核心代码。审批流插件作为一个典型示例,展示了如何从后端服务到前端页面的完整插件开发流程。

插件开发不仅可以满足特定业务需求,还可以促进代码复用和社区协作,为框架的生态建设做出贡献。