.net基本工作流入门
- 格式:pdf
- 大小:163.37 KB
- 文档页数:14
.NET基础培训教目录C#基础 (1)2.2变量 (1)2.3常量 (5)2.4预定义数据类型 (5)2.5流控制 (11)2.6数组 (20)2.7命名空间 (21)2.8C#预处理器指令 (27)2.9C#编程规则 (29)2.10内容总结 (33)2.11独立实践 (33)对象和结构 (35)3.1类和结构 (35)3.2类和成员 (36)3.3构造函数 (44)3.4结构 (48)3.5部分类 (51)3.6内容总结 (56)3.7独立实践 (56)1C#基础2.1变量在C#中声明变量使用下述语法:datatype 变量名称;例如:int i;该语句声明int变量i。
声明i之后,就可以使用赋值运算符(=)给它分配一个值:i = 10;还可以在一行代码中声明变量,并初始化它的值:int i = 10;如果在一个语句中声明和初始化了多个变量,那么所有的变量都具有相同的数据类型:int x = 10, y =20; // x and y are both ints要声明类型不同的变量,需要使用单独的语句。
在多个变量的声明中,不能指定不同的数据类型:int x = 10;bool y = true;int x = 10, bool y = true; // 这是不符合语法规定的!注意上面例子中的//和其后的文本,它们是注释。
//字符串告诉编译器,忽略其后的文本。
本章后面会详细讨论代码中的注释。
变量的初始化C#在使用变量之前必须进行初始化。
否则系统会提示错误,我们来做一个例子演示一下变量的初始效果,见实例2。
例2:演示一个变量的初始化解决方案:◆启动VS,输入如下代码public static void Main(){int d;Console.WriteLine(d);}在编译这些代码时,会得到下面的错误消息:Use of unassigned local variable 'd'◆此例子说明变量在输出之前需要进行初始化。
1、问:请谈一谈二进制序列化和Xml序列化的特点。
二进制序列化和反序列化使用BinaryFormatter类,Xml序列化使用XmlSerializer类。
二进制序列化的特点是:无论是否是只读属性,所有成员都将被序列化;序列化的性能高。
Xml序列化的特点是:互操作性强;可读性强。
2、问:什么是浅拷贝?什么是深层拷贝?如何实现深层拷贝?浅拷贝(shallow copy)也叫影子拷贝,在.NET里所有对象的基类Object类里就定义了一个MemberwiseClone()方法来实现浅拷贝。
具体做法是创建一个浅表副本,方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。
如果字段是值类型的,则对该字段执行逐位复制。
如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象。
在浅拷贝里会出现一个问题,那就是如果对对象A实行浅拷贝得到对象B,假设对象A中有引用类型变量M,一旦改变了M的值对象B中对应的变量值也会随之改变,这在有些情况下会产生不可预知的情况,为了解决这个问题,就需要实现深层拷贝(deep copy)。
实行深层拷贝之后,不管是A中值类型变量的值被复制到B中,连A中引用类型的字段的值也会被复制到B中,这样改变A中引用类型的值就不会反应到B中对应的字段上去。
如何实现深层拷贝呢?在MSDN中建议我们实现ICloneable来达到实现创建深层副本或者浅表副本的目的,在实际中一般都是采用序列化A,然后将序列化的结果反序列化得到B来实现深层拷贝的目的。
3、问:在c#中using和new这两个关键字有什么意义,请写出你所知道的意义?using 引入名称空间或者使用非托管资源new 新建实例或者隐藏父类方法new 约束用于在泛型声明中约束可能用作类型参数的参数的类型4、问:什么是SQL注入,如何防止?请举例说明。
如何预防答:利用sql关键字对网站进行攻击。
使用参数化方式,关键字过滤,字符编码5、什么是虚函数?什么是抽象函数?答:虚函数:没有实现的,可由子类继承并重写的函数。
.NET初学者架构设计指南(二)OO设计初次见面我使用OO技术第一次设计软件的时候,犯了一个设计者所能犯的所有错误。
那是一个来自国外的外包项目,外方负责功能设计,我们公司负责程序设计、编码和测试。
第一个重要的错误是,我没有认真的把设计说明书看明白。
功能点设计确实有一些问题,按照他们的设计,一个重要的流程是无法实现的。
于是我在没有与投资方沟通的情况下,擅自改动了设计,把一个原本在Linux系统上开发的模块改到了Windows系统上。
结果流程确实是实现了,但是很不幸,根本不符合他们的需要,比起原先的设计差的更多。
在询问了这个流程的设计意图之后,我也清楚了这一点。
对方的工程师承认了错误,但是问题是:“为什么不早说啊,我们都跟领导讲过了产品的构架,也保证了交货时间了,现在怎么去说啊?”。
他们设计的是一个苹果,而我造了一个桔子出来。
最后和工程师商议的结果是:先把桔子改成设计书上的苹果,按时交货,然后再悄悄的改成他们真正需要的香蕉。
的这时候距离交货的时间已经不足三天了,于是我每天加班工作到天明,把代码逐行抽出来,用gcc 编译调试。
好在大部分都是体力活,没有什么技术含量,即使在深夜大脑半休眠的情况下仍然可以接着干。
项目中出现的另外一个错误是:我对工作量的估计非常的不准确。
在第一个阶段的时候,按照功能设计说明书中的一个流程,我做了一个示例,用上了投资方规定的所有的技术。
当我打开浏览器,看到页面上出现了数据库里的“T om,Jerry,王小帅”,就愉快的跑到走廊上去呼吸了一口新鲜空气,然后乐观的认为:设计书都已经写好了,示例也做出来了,剩下的事情肯定就象砍瓜切菜一样了。
不就是把大家召集起来讲讲设计书,看看示例,然后扑上去开工,然后大功告成。
我为每个画面分配的编码工作量是三个工作日。
结果却是,他们的设计并不完美,我的理解也并不正确,大家的思想也并不一致。
于是我天天召集开会,朝令夕改,不断返工。
最后算了一下,实际上写完一个画面用的时间在十个工作日以上。
一.Asp。
Net 的工作原理:1。
客户端通过浏览器向服务器请求Web页。
2。
Web服务器(IIS)寻找指令(.aspx文件)3。
调用动态链接库Aspnet_isapi.dll处理.aspx文件,把。
aspx文件发送给(FrameWork中)公共语言运行时进行编译4.公共语言运行时对代码进行编译,生成html流5.把html流返回给IIS服务器,然后响应给客户端浏览器6。
客户端浏览器解释Html流,显示页面内容二. 的页面的执行过程1。
浏览器发送Http请求到web服务器(IIS)2.(如果IIS被Asp。
Net服务注册过)aspnet_isapi.dll就能筛选IIS不能处理的文件,把它交给公共语言运行时进行编译。
3.公共语言运行时所编译的对象为访问的页面类的实例(客户端浏览器请求的每个.aspx页面都对应个一个类,这个类继承System。
Web。
UI。
Page类)三.ISAPI:Internet时代,静态页面逐渐的不能满足客户端用户的需求,于是开发者需要扩充Web服务器的功能。
Web服务器厂商设计了不同的解决方案,但是都遵循了一个主题:允许向Web服务器插入某些组件扩充Web服务器的功能。
因此所有的Web服务器都允许开发者自己建立并插入组件增强Web服务器的功能。
微软的组件是:ISAPI(Internet Server:实际上是提供了一些技术,允许开发者自己向Web服务器插入某些组件来扩充功能。
ISAPI是一种重要的技术,它允许我们增强与ISAPI兼容的Web服务器的能力。
IIS就是与ISAPI兼容的Web服务器。
)IIS就是Web服务器。
ISAPI技术通过2种方式来增强web服务器的功能:1.ISAPI扩展:(扩展是通过DLL文件来实现的,如:aspnet_isapi.dll)是使用Win32动态链接库来实现的。
可以把ISAPI看成普通的应用程序,目标就是处理Asp。
Net 的http请求。
.NET基础培训教目录C#基础 (1)2.2变量 (1)2.3常量 (5)2.4预定义数据类型 (5)2.5流控制 (11)2.6数组 (20)2.7命名空间 (21)2.8C#预处理器指令 (27)2.9C#编程规则 (29)2.10内容总结 (33)2.11独立实践 (33)对象和结构 (35)3.1类和结构 (35)3.2类和成员 (36)3.3构造函数 (44)3.4结构 (48)3.5部分类 (51)3.6内容总结 (56)3.7独立实践 (56)1C#基础2.1变量在C#中声明变量使用下述语法:datatype 变量名称;例如:int i;该语句声明int变量i。
声明i之后,就可以使用赋值运算符(=)给它分配一个值:i = 10;还可以在一行代码中声明变量,并初始化它的值:int i = 10;如果在一个语句中声明和初始化了多个变量,那么所有的变量都具有相同的数据类型:int x = 10, y =20; // x and y are both ints要声明类型不同的变量,需要使用单独的语句。
在多个变量的声明中,不能指定不同的数据类型:int x = 10;bool y = true;int x = 10, bool y = true; // 这是不符合语法规定的!注意上面例子中的//和其后的文本,它们是注释。
//字符串告诉编译器,忽略其后的文本。
本章后面会详细讨论代码中的注释。
变量的初始化C#在使用变量之前必须进行初始化。
否则系统会提示错误,我们来做一个例子演示一下变量的初始效果,见实例2。
例2:演示一个变量的初始化解决方案:◆启动VS,输入如下代码public static void Main(){int d;Console.WriteLine(d);}在编译这些代码时,会得到下面的错误消息:Use of unassigned local variable 'd'◆此例子说明变量在输出之前需要进行初始化。
.netcore基础知识1.IOC(转:)IoC的全名Inverse of Control,翻译成中⽂就是“控制反转”或者“控制倒置”。
控制反转也好,控制倒置也罢,它体现的意思是控制权的转移,即原来控制权在A⼿中,现在需要B来接管。
那么具体对于软件设计来说,IoC所谓的控制权的转移具有怎样的体现呢?要回答这个问题,就需要先了解IoC的C(Control)究竟指的是怎样⼀种控制。
对于我们所在的任何⼀件事,不论其⼤⼩,其实可以分解成相应的步骤,所以任何⼀件事都有其固有的流程,IoC涉及的所谓控制可以理解为“针对流程的控制我们通过⼀个具体事例来说明传统的设计在采⽤了IoC之后针对流程的控制是如何实现反转的。
⽐如说现在设计⼀个针对Web的MVC类库,我们不妨将其命名为MvcLib。
简单起见,这个类库中只包含如下这个同名的静态类public static class MvcLib{public static Task ListenAsync(Uri address);public static Task<Request> ReceiveAsync();public static Task<Controller> CreateControllerAsync(Request request);public static Task<View> ExecuteControllerAsync(Controller controller);public static Task RenderViewAsync(View view);}MvcLib提供了如上5个⽅法帮助我们完成整个HTTP请求流程中的5个核⼼任务。
具体来说,ListenAsync⽅法启动⼀个监听器并将其绑定到指定的地址进⾏HTTP请求的监听,抵达的请求通过ReceiveAsync⽅法进⾏接收,我们将接收到的请求通过⼀个Request对象来表⽰。
.NET初学者架构设计指南(一)Helloworld的时代中学的时候,学校里开设了电脑课。
当时的电脑还是一种比较希罕的东西,学校里的电脑一共就十几台,还专门找了一个大厅摆放这些机器。
厅里面铺着厚厚的地毯,整天都拉着重重的窗帘。
每次上课前一天,我们需要沐浴更衣,剪好指甲。
上课时大家都穿上鞋套,排好队伍,列队进入机房。
然后各位同学坐在座位上,在老师的指挥下,拿出一张五英寸的软磁盘,磁盘里安装着DOS操作系统,插入电脑的A驱动器。
然后依次打开显示器、主机电源,在一阵吱吱声中,等待着电脑的启动,进入一个充满了幻想的神奇世界。
我就是在那个时候写出了第一行程序。
当时我们学的是一种叫做GWBASIC的语言,这是BASIC语言的一个分支。
BASIC是一种非常简单的交互式程序设计语言。
编码人员需要为每一行代码编制一个行号。
行号是一个自然数,为了日后调试的需要,一般都是在最初编制行号的时候故意留下富余,不是按照1、2、3……的方式编制行号,而是按照10、20、30……的形式。
程序输入完毕以后,运行“RUN”命令,编译器按照行号的顺序,解释执行程序。
这样的编程方式太简单了,只要记住几个流程控制、输入输出的关键字,就可以写出一个简单的程序。
那段时间我每天都在想着把平时遇到的东西用程序写出来,多元多次的方程式、猜数字的游戏、三角函数曲线……先把编程的思路记在纸上,每个星期上课的时候再在电脑上写出来,调试运行。
调试方式也非常简单,就是把数值往屏幕上PRINT,然后运行查看结果。
写完了之后运行“SAVE”命令,把代码保存到软盘里。
中学时期应该是一个人的思维最灵活的时期,以后的时期经验逐渐的丰富,但是学习新知识的能力实际上是在走下坡路。
除非特地去培养,很多方面的知识也就停留在中学的水平。
比如对于一个搞计算机的专业人员来说,他的历史、语文、物理、化学知识很可能就永远的停留在中学时期的水平。
那段时间我疯狂的写着程序,最大的愿望就是家里能有一台电脑,安装着GWBASIC的编译器,我可以每天把自己关在屋子里,用GWBASIC写出超级玛丽,或者坦克大战一样的游戏。
NET⼯程师必须掌握的知识点NET⼯程师必须掌握的知识点.NET⼯程师必须掌握的知识点Microsoft SQL Server 数据库⼀、创建和维护数据库1、数据库 SQL Server 数据库的组成部分?(参见联机丛书) 如何保证数据库的完整性、安全性、并发性? 数据库设计创建步骤?(参见联机丛书 - 创建数据库计划) 数据库设计考虑的事项?(参见联机丛书)2、SQL Server 表 设计表时应注意哪些? 如何创建和使⽤约束、默认值和空值? 数据完整性分类有哪些?并且它们分别包括哪些约束? 约束有哪些?语法? 如何添加、修改和删除列?在哪些情况下不可删除列? 创建和修改表3、SQL Server 索引 索引的概念 索引的体系结构 索引的特性 索引的优点 索引的缺点 索引语法结构 主键、约束和索引 索引创建基本准则 索引的实际应⽤ 重建索引?4、SQL Server 视图 视图概念 功能特性 视图的⼏⼤优点 在创建视图前请考虑则 索引视图 索引视图必须满⾜下列要求 分区视图 可更新分区视图 可更新的分区视图规则 可更新的分区视图数据修改规则 分布式分区视图规则 视图使⽤时机5、SQL Server 存储过程6、SQL Server 触发器 触发器的概念和作⽤ 触发器常⽤的⼀些功能 触发器的分类 DML触发器的⼯作原理 After触发器的⼯作原理 INSERT触发器的⼯作过程 DELETE触发器的⼯作过程 UPDATE触发器的⼯作过程 Instead Of 触发器的⼯作原理 设置After触发器的激活顺序7、临时表和表变量 临时表(局部临时表、全局临时表)和表变量的创建代码 临时表变量优点 表变量与临时表相⽐,存在哪些缺陷 表变量和临时表的区别 临时表和表变量的适⽤场合8、T-SQL 语法9、SQL Server 中的空值及其处理 空值说明 检测空值 处理空值的函数10、SQL语句优化的原则和性能调优11、事务和死锁 事务具有四个特性 事务并发处理会产⽣的问题 事务的隔离级别 创建事务命令 设置事务级别: 开始事务: 提交事务: 回滚事务: 创建事务保存点: 回滚到事务点: 创建事务的原则12、管理和配置服务器 数据库⽇志管理 数据库的安全管理 DBCC 数据库维护命令 数据库实⽤⼯具(C#)2.0 开发⼀、C#语法1、有关.NET体系结构的基本知识 CLR概念? 在.NET中,程序编译过程? 托管代码的优点? 语⾔互操作性的真正含义和表现形式? 中间语⾔的主要特征? 动态语⾔和静态语⾔、强类型定义语⾔和弱类型定义语⾔的概念区分?2、C#基础 变量定义 如何变量的初始化 变量的作⽤域 常量 字符串处理 使⽤正则表达式 什么是CTS类型?数据类型如何分类以及各个数据类型范围? 类型的转换分类? 显式转换和隐式转换如何区别? 值类型和引⽤类型区别? 数值类型之间的相互转换? 字符串和字符数组之间的转换? 字符的 ASCII 码和 Unicode 码? 字符串和字节数组之间的转换?如何进⾏编码转换? 各种数值类型和字节数组之间的转换? 何谓流控制?条件语句、循环语句、跳转语句各有哪些? 何谓枚举?何时使⽤、如何使⽤枚举,并要注意哪些细节? 数组 C#预处理器指令是什么,有何功能;有哪些预处理器指令并且如何使⽤? 表达式、运算符3、类和结构 结构功能特性?实现代码? 结构和类的相同和不同之处?如何选择结构还是类? 基类包括哪些元素?基类的特点?实现代码? 静态类和静态成员有哪些功能特性?实现代码? 什么是部分类/分部类?哪些功能特性?实现代码?适⽤场合?需遵循⼏个规则? 密封类功能特性?实现代码?为什么要使⽤密封类? 什么是抽象类?功能特性?实现代码?接⼝与抽象类的区别? 什么是接⼝?功能特性?实现代码?接⼝与抽象类的区别? 什么是泛型?泛型有哪些优点? 什么是构造函数?有哪些构造函数?各个构造函数的定义、实现⽅法、注意事项? This关键字和Base关键字⽤途?实现代码? 什么是反射?如何实现反射?反射有何优缺点?何时使⽤反射? 什么是委托?特点?何时使⽤委托⽽不使⽤接⼝?如何声明、实例化和使⽤委托? 什么是索引器?4、集合 共有⼏种集合类型? 各种集合间的区别?哪些集合是属于类、接⼝和结构? 各种集合的定义?功能特性?实现代码? 泛型介绍、泛型的集合实现、泛型的优点、泛型类型参数、类型参数的约束 泛型类、接⼝、⽅法、委托的实现代码?泛型代码中的默认关键字?泛型和反射?5、内存管理和指针6、错误和异常处理⼆、平台部分(C# 编程指南) 应⽤程序域 程序集和全局程序集缓存 属性 异常和异常处理 互操作性 线程处理 性能 安全性 缓存 状态管理(Cookies 、Session 、Application 、ViewState 等9个)三、开发Web应⽤程序 应⽤程序⽣命周期概述 页⽣命周期概述 母版 主题 Web部件 Web服务器控件 HTML服务器控件 数据访问 Web Service .Net Ajax .NET Remoting Web 应⽤程序的基本安全实施策略设计模式 为什么使⽤设计模式 什么时候使⽤设计模式 ⾯向对象设计的基本原则 ◆必须要掌握的模式 01、简单⼯⼚(Factory)模式 02、⼯⼚⽅法(Factory Method)模式 03、抽象⼯⼚(Abstract Factory)模式 04、单例(Singleton)模式 05、建造(Builder)模式 07、策略(Strategy)模式 08、门⾯(Facade)模式 09、调停者(Mediator)模式 10、合成(Composite)模式 11、装饰(Decorator)模式 12、访问者(Visitor)模式 13、适配器(Adapter)模式 14、桥梁(Bridge)模式 15、命令(Command)模式 ◆其他模式 16、观察者(Observer)模式 17、迭代⼦(Iterator)模式 18、备忘录(Memento)模式 19、责任链(Chain of Responsibility)模式 20、解释器(Interpreter)模式 21、代理(Proxy)模式。
.net的基础概念知识
.Net的基础概念
.Net是指.net Framework框架,⼀种平台,⼀种技术;
.Net分为.net Framework框架和.net平台;通俗点:.net平台相当于厨房,.net Framework框架相当于材料和做饭锅;
.Net Framework框架是.Net平台中不缺少的⼀部分,他提供了⼀个稳定的运⾏环境保证我们基于.Net平台开发各种应⽤正常的运转。
.Net的能做什么
1.桌⾯应⽤程序(winform应⽤程序)
2.Internet应⽤()
⽐如:当当⽹、京东、汽车之家等
3.⼿机开发
4.Unity 3D游戏开发或者虚拟现实
.Net的两种交互模式
c/s(客户端需要安装专⽤的客户端的软件)
b/s(只需要安装⼀个浏览器即可)
C# ⼀种变成语⾔,可以开发基于.net平台的应⽤。
C# 代码规范
在C#中通常使⽤的两种编码⽅式如下
Camel(驼峰式):⼤⼩写形式-除了第⼀个单词,所有单词第⼀个字母⼤写,其他字母⼩写。
Pascal(帕斯卡):⼤⼩写形式-所有单词第⼀个字母⼤写,其他字母⼩写。
⽅法中参数和private的字段⽤Camel(驼峰式),其他都有⽤Pascal(帕斯卡)。
工作流模型分析作者:胡长城(银狐999)Email:james-fly@创作时间:2003年11月早就想写篇有关工作流模型方面的文档。
一直以来,网上只发现一些英文文档,有关工作流的中文文档实在太少,有关工作流模型的更是稀少。
就不罗嗦了,直接进入正题吧。
接下了及后续的篇幅,我会为大家介绍以下几方面内容:起点模型,激活模型,运转模型,流程组合嵌套模型,流程整合模型等。
其中,第三节的运转模型,理所当然的是本篇的重中之重了,说的也比较细致。
请参看下面的目录结构。
目录=============================================================================一、流程的起点模型1.1 单起点(Single Start Node)1.2 多起点多起点方式一多起点方式二多起点方式三二、流程的激活模型2.1 人工激活2.2 定时或限时激活2.3 外界消息激活三、流程的运转模型3.1 基本运转模型串行(Sequence)自循环3.2 发散运转模型并行(Parallel)独占式选择(Exclusive Choice)鉴别式选择(Discriminator Choice)抄送模型发散模型3.3 聚合运转模型同步聚合(synchronize merge)简单聚合(Simple Merge)多重聚合(Multiple Merge)鉴别式聚合(Discriminator Merge)四、流程组合嵌套模型4.1 内嵌模型主流程等待方式主流程也运行方式4.2 外嵌模型五、流程整合模型================================================================================= 有关“什么是工作流”和工作流的概念,就不在这里介绍了。
大家有兴趣的可以到WFMC上看看。
这里先说说个人的看法:一个工作流包括一组任务(Task)及它们的相互顺序关系,还包括流程及任务的启动和终止条件,以及对每个任务的描述。
其实这是摘自/workflow/workflow.htm 上一段话有关工作流的描述。
只是原文叫“活动”,我改为任务(Task),可能更好理解一些。
其实,现在已经跳出了单工作流的圈子,越来越倾向于多工作流之间的嵌套或整合,在本文后面的第4、5节会简要的介绍。
在进入各个模型说明前,需要说明一些有关本篇文章中,出现的一些图形含义。
既然然流程图,就免不了用图形表示,用图标代替一些流程节点的含义。
如下图所示:有关器各个图标的含义,在后续会说明。
一、流程的起点模型任何事物都有由头有尾,一个流程也不例外,那么现在我们就从流程的“头”——流程起点说起。
首先,需要说明的是,起点也是一种任务节点(Task Node)。
1.1 单起点(Single Start Node)单起点估计大家都比较容易理解,现实中工作流应用的也是最为普遍。
如下图(1-1)所示,其就是单起点的模型。
在接下来的所有图像中,一个绿色方框代表一个起点。
图(1-1)1.2 多起点多起点的工作流,在现实应用多不是太多。
其主要表达的是,在同一流程中,存在多个起点。
说到这里,有必要重新申明一下:起点也是一种任务节点,也就说起点不是独立于工作流任务的,在流程启动的时候,其也需要完成某种特定的任务,以激活整个工作流的运转。
多起点的工作流模型,基本上有如下三种方式。
多起点方式一请参考图(1-2),起点A和起点B,它们都可以激活流程的运行,而且激活后,流程都会共同指向Task A。
所以,对于Task B来说,其不关心流程是如何激活的,其只关系从Task A是否正确的传递来正确的流程数据。
图(1-2)多起点方式二在方式二(如下图(1-3))中,起点A激活工作流后,导致流程沿着Task A——Task B——Task C方向流转。
而从起点B激活工作流后,Task A则被跳过。
这种方式,在现实中是极为少见的。
如果将Start B——Task B这条流程段与 Start A——Task B 这条流程段,分开来看。
则可以近似看作的两个“子流程”的选择性汇总(两选一,或多选一)的情况。
图(1-3)多起点方式三方式三(如下图(1-4)),虽然也存在多个起点,但是基本是按照一个统一流程方向运行的。
这是与方式二最大的区别所在。
在此,须要再此申明:一个起点(Start Node)同时也是一个任务节点(Task Node)。
参看图中的Task B/Start B节点。
此种方式,在现实中,还是有一定应用性的。
特别是在多个流程之间信息交互的时候,流程A发送消息数据,激活流程B的运行。
但是未必是从流程B的默认激活点激活,可能是从流程B的中途某个任务激活。
比如图中的Task B/Start B任务节点(同时也时流程起点)图(1-4)二、流程的激活模型上面我们看了工作流的起点模型。
也知道任何流程,都必须有起点,或者相对的起点。
一个流程被激活后,会从起点开始沿着预定的流程路线,有序或无序的往下进行(注意,我这里提到了“无序”二字,我将在后续讲解“无序”状态)。
所以,起点就是这个流程被激活的源头。
下面让我们来看看,一个流程被激活的方式,或者说一个起点,被激活的方式:从起点的激活方式,有如下两种方式:2.1 人工激活大多数的流程激活,都是因为人为的信息数据输入或产生。
比如一个订单处理流程,客户提交了订单信息(订单信息数据产生),则激活了订单处理流程的开始。
2.2 定时或限时激活在一个特定的时间,因为特定的情况,符合特定的条件,激活某个特定的流程(或任务)。
这种激活方式,在现实中很少单独出现,大多数情况,都因为在某一个流程中,因为在限定的时间内,因某项任务未达到预期的状态,而激活另外的任务或新的处理流程。
也就说,这种方式,是受外来因素影响的,而且大多与一些流程任务(或流程模式)一起出现。
举个定时激活的实例:比如,订单处理流程,限定5天内发货,那么定义在第三天的时候,如果没有接到发货通知,则激活一个催办信息(催办任务)。
这样流程系统,会在第三天的时候自动发出催办信息。
2.3 外界消息激活这种方式,大多是在多流程信息交互(或大小流程嵌套)应用中。
现在比较流行的业务流程整合/管理(BPM),基本上都涉及到这方面内容。
如下图所示,流程A,在结束的时候(在以下的所有图中,将采用红色框图,表示结束节点),会向流程B发送Message,以激活流程B的运行。
至于这个消息是Soap消息,还是通过消息中间件转发的Message,这就是不同的应用方式了。
一般现实应用中,都需要考虑JMS或WebService的应用接口。
从个人目前所实施过的工作流应用来说,大多还是采用Message Query方式居多。
虽然软件的发展,逐渐SOA(面向服务)化,但是WebService 的安全性或数据正确性,还有待进一步的发展,从这一方面说,比起消息中间件的高度安全性和消息正确性,WebService目前还是稍逊一筹。
其实,安全性和信息正确性,是很多应用客户非常关心的焦点。
但是,SOA化的发展是未来的趋势。
所以现在大多的应用都会提供JMS和WebService接口,或其他类似接口。
图(2-1)三、流程的运转模型这里将是本文最为核心的地方了,什么是工作流,也将在其运转模型中体现。
任何事物都是循序渐进的,由简单到复杂。
我们先来看看最为基本的集中运转模型3.1 基本运转模型串行(Sequence )串行,是最为简单,也最为容易理解的模型。
按照预定的任务列表(Task A,Task B,Task C ),有序的执行,如下图(3-1)所示。
图(3-1)自循环自循环的模型,主要用于表示:同一个任务节点,重复的执行多次。
图(3-2)如图中所显示。
“模式2”比“模式1”多了一个鉴别节点(Discriminator Node )。
这两种模式,在现实中应用的都较为广泛,其中“模式1”更多的偏向人为的选择,也就是说,在任务执行后,由人为的决定是否继续重复的执行这次任务;而“模式2”则更多的倾向于一个既定的规则,按照原有的规则,决定是否重复执行。
3.2 发散运转模型并行(Parallel )并行,就涉及到流程的分支概念。
就是说在流程运行过程中,因为不同的条件或情况,或者处理的业务需要多部门(多任务)分开处理,而产生了流程分支。
如下图所示图(3-3)流程在执行完任务A 后,因为需要,产生了两个并发执行的分支(A ——B 和A ——C )。
这两个分支之间是对等的,也是并行执行的。
有关上面的流程图,可能在以后的一些文章/文档中,大家会看到下面类似的图形图(3-4)虽然比上图多了一个And 选择器,但实际上,两图,表示的是同一个含义或模型。
所以大家在应用或读书的时候,可以长个心眼哦,自己学会实质性的分析。
独占式选择(Exclusive Choice)当一个任务处理完后,发现其后面可允许走多个分支流程,但只允许选择其中某一个分支运行。
这个选择是人为决策的,预先没有设点选择的规则。
图(3-5)鉴别式选择(Discriminator Choice)这同前面的“独占式选择”很相似,唯一不同点,就是多了一个鉴别器(Discriminator)。
当任务达到这个鉴别器的时候,鉴别器会根据当前流程所处的状态,对比预先设定的一些选择规则,自动判别接下来流程的流向,也就是自动根据条件,选择一个满足条件的分支运行。
图(3-6)鉴别器模式(有的可能叫选择器等等名字,表达的意思基本相同),在现实应用中较为广泛。
比如在订单申请流程中,设定一个依据数额判别流向的鉴别器,如果数额大于等于5000就走分支流程A,如果数额小于5000就走分支流程B。
抄送模型抄送模型,本身不是一个标准的工作流运转模型,但是在现实应用中,比比皆是。
它表达的意思是(请参考下图),存在主流程(A——C),在一个任务(A)执行完毕后,会继续执行主流程上下一个预定任务(C),但是同时也会激活另一任务(B)(或另外的流程)的执行,但是任务B 以及任务B的后续流程,不会对主流程运转造成影响。
请注意图中的A——B流程沿线,用的是灰色虚线表示,而且任务B也同样采用灰色表示。
图(3-7)来个举个电子办公系统中,经常遇到得例子说明一下:比如一个发文,在交司局会签的时候,可能会抄送一份给另外的司局备案,这个过程就或额外的激活一个不影响主会签流程的“抄送任务”,比如图中Task B。
发散模型说到这里,大家可再回过头参看一下并行模型(3.2.1节)。
发散和并行最大的区别就是,各个分支(branch)的流程状态(或流程数据):在并行模型中,分支状态(A-B)与分支状态(A-C)是大多数情况下是不相等的。
由任务A执行后的状态进行一定条件下的“拆分”,形成了两个分支(或多个分支)流程。