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

news2025/4/5 0:42:59

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

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

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

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

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

二、主要实现思路

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

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

三、具体集成ccflow操作步骤

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

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

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

  1. using System;

  1. using System.Collections.Generic;

  1. using System.Linq;

  1. using System.Text;

  1. using BP.En;

  1. using BP.Web;

  1. using BP.Sys;

  1. namespace BP.Def

  1. {

  1. public class FlowExtAttr : BP.WF.Template.FlowAttr

  1. {

  1. /// <summary>

  1. /// 自定义业务编号

  1. /// </summary>

  1. public const string DefNoFormat = "DefNoFormat";

  1. /// <summary>

  1. /// 自定义业务名称

  1. /// </summary>

  1. public const string DefNameFormat = "DefNameFormat";

  1. /// <summary>

  1. /// 删除流程时是否同时删除自定义

  1. /// </summary>

  1. public static string IsDeleteDef = "IsDeleteDef";

  1. }

  1. public class FlowExt : BP.WF.Template.FlowExt

  1. {

  1. public FlowExt()

  1. {

  1. }

  1. public FlowExt(string _No)

  1. {

  1. this.No = _No;

  1. this.Retrieve();

  1. }

  1. /// <summary>

  1. /// 重写基类方法

  1. /// </summary>

  1. public override Map EnMap

  1. {

  1. get

  1. {

  1. //web界面中的Tab展示控制

  1. EnCfg en = new EnCfg(this.ToString());

  1. if (en.GroupTitle.Contains(FlowExtAttr.DefNoFormat) == false)

  1. {

  1. en.SetValByKey(EnCfgAttr.GroupTitle, en.GroupTitle + "@" + FlowExtAttr.DefNoFormat + "=自定义扩展");

  1. en.Save();

  1. }

  1. //首次构造返回基类

  1. if (this._enMap == null)

  1. {

  1. this._enMap = base.EnMap;

  1. return this._enMap;

  1. }

  1. //基类构造完成后,后续使用子类

  1. int index = this._enMap.Attrs.GetIndexByKey(FlowExtAttr.DefNoFormat);

  1. //新增加的配置

  1. if (this._enMap != null && this.Row.Count > && string.IsNullOrEmpty(this.No) == false && index < )

  1. {

  1. this._enMap.AddTBString(FlowExtAttr.DefNoFormat, "", "自定义业务编号", true, false, , , , true);

  1. this._enMap.AddTBString(FlowExtAttr.DefNameFormat, "", "自定义业务名称", true, false, , , , true);

  1. this._enMap.AddBoolean(FlowExtAttr.IsDeleteDef, false, "删除流程时是否同时删除自定义", true, true, true);

  1. }

  1. return this._enMap;

  1. }

  1. }

  1. /// <summary>

  1. /// 自定义业务编号

  1. /// </summary>

  1. public string DefNoFormat

  1. {

  1. get

  1. {

  1. return this.GetValStrByKey(FlowExtAttr.DefNoFormat);

  1. }

  1. set

  1. {

  1. this.SetValByKey(FlowExtAttr.DefNoFormat, value);

  1. }

  1. }

  1. /// <summary>

  1. ///自定义业务名称

  1. /// </summary>

  1. public string DefNameFormat

  1. {

  1. get

  1. {

  1. return this.GetValStrByKey(FlowExtAttr.DefNameFormat);

  1. }

  1. set

  1. {

  1. this.SetValByKey(FlowExtAttr.DefNameFormat, value);

  1. }

  1. }

  1. /// <summary>

  1. /// 删除流程时是否同时删除自定义

  1. /// </summary>

  1. public bool IsDeleteDef

  1. {

  1. get

  1. {

  1. return this.GetValBooleanByKey(FlowExtAttr.IsDeleteDef);

  1. }

  1. }

  1. }

  1. public class FlowExts : BP.WF.Template.FlowExts

  1. {

  1. public FlowExts()

  1. {

  1. }

  1. public override Entity GetNewEntity

  1. {

  1. get { return new FlowExt(); }

  1. }

  1. }

  1. }

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/152013.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】堆

堆 堆的定义 &#xff08;最大&#xff09;堆是一个可以被看成一棵树的数组对象&#xff0c;满足如下性质: 堆中的父亲结点总大于或等于其左右孩子结点的值总是一棵完全二叉树 完全二叉树 若设二叉树的深度为h&#xff0c;除第 h 层外&#xff0c;其它各层 (1~h-1) 的结点…

1.1.1半导体基础知识

半导体基础知识 上学的时候大概是模电第一节就会讲完这&#xff0c;会详细的介绍什么是导体&#xff0c;绝缘体&#xff0c;半导体&#xff0c;本征半导体&#xff0c;然后接着详细的讲述本征半导体的结构&#xff0c;两种载流子&#xff0c;P,N杂质半导体&#xff0c;PN结以及…

Spring Boot自动配置--如何切换内置Web服务器

系列文章目录 Spring Boot[概述、功能、快速入门]_心态还需努力呀的博客-CSDN博客 Spring Boot读取配置文件内容的三种方式_心态还需努力呀的博客-CSDN博客 Spring Boot整合Junit_心态还需努力呀的博客-CSDN博客 该系列文章持续更新中~ 目录 系列文章目录 前言 一、默认…

【Python】python深拷贝和浅拷贝(二)

【Python】python深拷贝和浅拷贝&#xff08;二&#xff09; 前言 上一期我们介绍了Python中深拷贝和浅拷贝的定义以及它们在执行过程中内存结构&#xff0c;同时也给出了深拷贝和浅拷贝的方法。&#xff08;没有看上一期的朋友看这里&#xff0c;python深拷贝和浅拷贝&#…

架构设计---性能设计的详解

前言&#xff1a; 系统性能是互联网应用最核心的非功能性架构目标&#xff0c;系统因为高并发访问引起的首要问题就是性能的问题&#xff0c;高并发访问的情况下&#xff0c;系统因为资源不足&#xff0c;处理每个请求的时间都会变慢&#xff0c;看起来就是性能的变差。 因此…

什么是随机森林?

什么是随机森林&#xff1f; 随机森林是一种有监督的机器学习算法。由于其准确性&#xff0c;简单性和灵活性&#xff0c;它已成为最常用的一种算法。事实上&#xff0c;它可以用于分类和回归任务&#xff0c;再加上其非线性特性&#xff0c;使其能够高度适应各种数据和情况。 …

JavaSE初阶篇:系统环境变量path|classpath|JAVA_HOME

环境变量是为了 “在命令行窗口下”编译和运行Java程序而配置一、系统变量&#xff1a;Pathpath环境变量作用&#xff1a;将命令所在的路径配置到path中去&#xff0c;就相当于在计算机中“注册”了一样&#xff0c;以后找这个命令&#xff0c;会直接去你配置的路径下寻找。达到…

Revit中怎么使两面墙拉近时不自动连接?柱断梁墙功能

一、Revit中怎么使两面墙拉近时不自动连接? 问题&#xff1a;同材质的墙体在同一条直线上只要将其端点拖拽至一起就会融合成一道整墙体(如图-1、2所示)&#xff0c;但是在做一些较特殊的结构时我们不需要其连接成一道整墙&#xff0c;有没有什么办法能够设置呢? 我们可以通过…

避免Mysql插入重复数据的几种方法

1、前言 在平时对数据库操作时&#xff0c;有时候需要向数据库中插入一些数据&#xff0c;此时就需要使用数据库的插入语句&#xff0c;但是在向数据中库插入数据时&#xff0c;不能盲目插入&#xff0c;因为盲目的插入可能会造成数据重复&#xff0c;浪费数据库的资源&#x…

Pytest三种配置文件

&#x1f60e;&#x1f60e;原文出自&#xff1a;测个der&#xff0c;博主的公众号&#xff0c;格式美观一些。 配置介绍 pytest 的主配置文件&#xff0c;可以改变 pytest 的默认行为&#xff0c;执行 pytest -h&#xff0c;这里有很多配置均可用于 pytest.ini配置 (venv) …

HarmonyOS鸿蒙学习笔记(16)Canvas入门使用

Canvas入门指南1、Canvas代码结构2、简单案例2.1 fillStyle和fillRect 绘制蓝色矩形2.2 strokeRect和strokeStyle 绘制红色边框2.3 lineCap的使用2.4 lineJoin的使用2.5 closePath的使用3、参考资料1、Canvas代码结构 在使用Canvas的时候&#xff0c;需要向初始化RenderingCon…

第四十七讲:IPv6基础知识

一、IPv6网络元素及概念 IPv6的网络元素如下图所示。 节点&#xff1a;任何运行IPv6的设备&#xff0c;包括路由器和主机&#xff08;甚至还将包括PDA、冰箱、电视等&#xff09;。邻节点&#xff1a;连接到同一链路上的节点。这是一个非常重要的概念&#xff0c;因为IPv6的邻…

JS面试题--this指向+面试题

this其他补充 内置函数的绑定思考 01_一些函数的this分析 // 1.setTimeout原理 // function hySetTimeout(fn, duration) { // fn.call(window) // }// hySetTimeout(function() { // console.log(this) // window // }, 3000)// setTimeout(function() { // console.l…

EEG论文阅读和分析:《Differential entropy feature for EEG-based emotion classification》

论文阅读《Differential entropy feature for EEG-based emotion classification》 论文的核心是提出差分熵作为特征&#xff0c;并且对差分差分熵和比例差分熵等特征进行对比研究。 算法流程步骤&#xff1a; 采样过程&#xff1a; A.预处理 根据受试者的压力反应&#xf…

零基础转行软件测试可行吗?

如今&#xff0c;随着人们对软件质量的要求越来越高&#xff0c;软件测试已经成为最热门的IT行业之一。不少非科班出身的转业者也纷纷开始观望这个行业&#xff0c;因此不少人会问&#xff0c;零基础转行软件测试有前途吗&#xff1f;答案显而易见&#xff0c;如果你想成为最炙…

【C语言】数据类型(基本类型、构造类型、类型转换)

⏰打卡&#xff1a;DAY1 &#x1f3c6;今日学习目标&#xff1a;数据类型&#xff08;基本类型、构造类型、类型转换&#xff09; ✨个人主页&#xff1a;颜颜yan_的个人主页 &#x1f389;专栏系列&#xff1a;从0开始学C语言 文章目录前言基本类型整型浮点型字符型构造类型数…

Mybatis学习——增删改(mysql8.0)

目录 一、配置文件 (一)添加mybatis依赖&#xff1a; (二)resources资源目录的配置 1.database.properties文件的设置 2.mybatis-config.xml文件的设置 二、引入原始类 三、DogDao接口&#xff0c;定义增删改功能 (一)单条数据增删改 1.新增 2.删除 3.修改 (二)多条…

Makefile详细教程

Makefile详细教程 我编写本指南是因为我永远无法完全理解 Makefile。 他们似乎充斥着隐藏的规则和深奥的符号&#xff0c;提出简单的问题并没有得到简单的答案。 为了解决这个问题&#xff0c;我花了几个周末的时间坐下来阅读所有关于 Makefile 的内容。 我已将最关键的知识浓…

【链表】leetcode206.反转链表(C/C++/Java/Js)

leetcode206.反转链表1 题目2 思路2.1 双指针法&#xff08;迭代&#xff09;2.2 递归法2.2.1 递归--从前往后翻转指针指向2.2.2 递归--从后往前翻转指针指向3 代码3.1 C版本&#xff08;迭代&#xff09;3.2 C版本&#xff08;迭代递归&#xff09;3.3 Java版本&#xff08;迭…

【OpenDDS开发指南V3.20】第十章:Java Bindings

介绍 OpenDDS提供JNI绑定。Java应用程序可以像C++应用程序一样使用完整的OpenDDS中间件。 有关入门的信息,包括先决条件和依赖项,请参阅$DDS_ROOT/java/INSTALL文件。 Java版本9和更高版本使用Java平台模块系统。要在这些Java版本中使用OpenDDS,请将MPC特性Java_pre_jpms…