• .net工作流引擎ccflow集成并增加自定义功能


    一、为什么需要自定义扩展

    1、第三方类库已满足大部分需求,剩下的根据具体业务需求抽象成公共功能进行扩展

    2、第三方呈现的web页面与原类库耦合度较高,希望在原页面上扩展而不影响原来的功能

    3、在完全不修改第三方类库及web页面的情况下,加入自己的代码

    4、未来可以同步更新第三方类库

    二、主要实现思路

    1、类库通过继承的方式扩展

    2、asp.net页面通过增加一个分部类来调用扩展后的类库

    三、具体集成ccflow操作步骤

    1、解决方案引入ccflow核心三大类库,确保三大类库的与解决方案不在同一个目录,由ccflow维护更新

    2、新建自己业务的扩展类库,扩展类库命名空间必须以BP开头,与ccflow类库命名规则保持一致,否则无法反射完成初始化

    3、在扩展类库中新建一个BP.Def.FlowExt类,以继承BP.WF.Template.FlowExt类为例,关键是重写子类的EnMap属性

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 using BP.En;
      6 using BP.Web;
      7 using BP.Sys;
      8 
      9 namespace BP.Def
     10 {
     11 
     12     public class FlowExtAttr : BP.WF.Template.FlowAttr
     13     {
     14         /// <summary>
     15         /// 自定义业务编号
     16         /// </summary>
     17         public const string DefNoFormat = "DefNoFormat";
     18         /// <summary>
     19         /// 自定义业务名称
     20         /// </summary>
     21         public const string DefNameFormat = "DefNameFormat";
     22         /// <summary>
     23         /// 删除流程时是否同时删除自定义
     24         /// </summary>
     25         public static string IsDeleteDef = "IsDeleteDef";
     26     }
     27 
     28     public class FlowExt : BP.WF.Template.FlowExt
     29     {
     30         public FlowExt()
     31         {
     32            
     33         }
     34 
     35         public FlowExt(string _No)
     36         {
     37             this.No = _No;
     38             this.Retrieve();
     39         }
     40 
     41         /// <summary>
     42         /// 重写基类方法
     43         /// </summary>
     44         public override Map EnMap
     45         {
     46             get
     47             {
     48                 //web界面中的Tab展示控制
     49                 EnCfg en = new EnCfg(this.ToString());
     50                 if (en.GroupTitle.Contains(FlowExtAttr.DefNoFormat) == false)
     51                 {
     52                     en.SetValByKey(EnCfgAttr.GroupTitle, en.GroupTitle + "@" + FlowExtAttr.DefNoFormat + "=自定义扩展");
     53                     en.Save();
     54                 }
     55 
     56                 //首次构造返回基类
     57                 if (this._enMap == null)
     58                 {
     59                     this._enMap = base.EnMap;
     60                     return this._enMap;
     61                 }
     62 
     63                 //基类构造完成后,后续使用子类
     64                 int index = this._enMap.Attrs.GetIndexByKey(FlowExtAttr.DefNoFormat);
     65 
     66                 //新增加的配置
     67                 if (this._enMap != null && this.Row.Count > 0 && string.IsNullOrEmpty(this.No) == false && index < 0)
     68                 {
     69                     this._enMap.AddTBString(FlowExtAttr.DefNoFormat, "", "自定义业务编号", true, false, 0, 50, 10, true);
     70                     this._enMap.AddTBString(FlowExtAttr.DefNameFormat, "", "自定义业务名称", true, false, 0, 50, 10, true);
     71                     this._enMap.AddBoolean(FlowExtAttr.IsDeleteDef, false, "删除流程时是否同时删除自定义", true, true, true);
     72                 }
     73 
     74                 return this._enMap;
     75             }
     76         }
     77 
     78         /// <summary>
     79         /// 自定义业务编号
     80         /// </summary>
     81         public string DefNoFormat
     82         {
     83             get
     84             {
     85                 return this.GetValStrByKey(FlowExtAttr.DefNoFormat);
     86             }
     87             set
     88             {
     89                 this.SetValByKey(FlowExtAttr.DefNoFormat, value);
     90             }
     91         }
     92 
     93         /// <summary>
     94         ///自定义业务名称
     95         /// </summary>
     96         public string DefNameFormat
     97         {
     98             get
     99             {
    100                 return this.GetValStrByKey(FlowExtAttr.DefNameFormat);
    101             }
    102             set
    103             {
    104                 this.SetValByKey(FlowExtAttr.DefNameFormat, value);
    105             }
    106         }
    107 
    108         /// <summary>
    109         /// 删除流程时是否同时删除自定义
    110         /// </summary>
    111         public bool IsDeleteDef
    112         {
    113             get
    114             {
    115                 return this.GetValBooleanByKey(FlowExtAttr.IsDeleteDef);
    116             }
    117         }
    118     }
    119 
    120     public class FlowExts : BP.WF.Template.FlowExts
    121     {
    122         public FlowExts()
    123         {
    124         }
    125 
    126         public override Entity GetNewEntity
    127         {
    128             get { return new FlowExt(); }
    129         }
    130     }
    131 }
    View Code

     4、在解决方案新建一个web项目,完全拷贝ccflow下的WF、DataUser目录到web项目里,最终整个结构如下

    5、为后台页面增加一个分部类,在分部类里修改asp.net页面入口,转向访问自定义的BP.Def类库

    6、最终效果达到在完全不修改ccflow的前后台源码下实现自定义功能的扩展

  • 相关阅读:
    匿名函数
    Ajax
    Mysql 数据库操作
    Linux下查看apache连接数
    c++ 当输入的数据不符合数据类型时,清理输入流
    c++ 将输入存储到数组,然后反转数组,最后输出
    c++ 递归求一个数的阶乘
    c++ 计算彩票中奖概率
    c++ 结构体,设置物品体积并输出物品属性
    c++ 输入10个数,显示它的平均分
  • 原文地址:https://www.cnblogs.com/my-cnblog/p/8194929.html
Copyright © 2020-2023  润新知