一、为什么需要自定义扩展
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 }
4、在解决方案新建一个web项目,完全拷贝ccflow下的WF、DataUser目录到web项目里,最终整个结构如下
5、为后台页面增加一个分部类,在分部类里修改asp.net页面入口,转向访问自定义的BP.Def类库
6、最终效果达到在完全不修改ccflow的前后台源码下实现自定义功能的扩展