Kilxy的WF(Windows Workflow Foundation)学习手记(一)
Posted on 2006-12-15 15:21 kilxy 阅读(2126) 评论(13) 编辑 收藏 引用 网摘
0 前言
各位网友大家好!
Vista
的到来对于跟随微软的开发人员可谓又是一场技术的革命,革命尚未到来已经就有了山雨欲来风满楼的感觉。从去年的
Avalon
(
WPF
开发代号)、
Indigo
(
WCF
开发代号)、
InfoCard
(
CardSpace
开发代号)到现在的
.Net Framwork 3.0
的
RTM
版本已经有了将近两年的时间,在这段时间里相信大家也都对这些技术有一定的了解。
本人在学习
.Net Framework 3.0
的过程中没有找到一个整体介绍的中文文档,更没有针对
WF
的具体介绍,所以只能通过
MSDN
和
SDK
学习。本文主要是收集了我在学习
WF
过程中的资料和我对
WF
的个人理解,在本文中会引用大量的微软的
MSDN
、
PPT
和
SDK
中的例子来对每一个内容进行讲解,同时也会引用一些网友的
Blog
(会注明作者)。本着自我学习、自我提高的目的和大家一起学习
WF
,由于时间有限文中错误之处希望大家指正。
联系方式
MSN
:
kilxy@hotmail.com
E-mail: Vista-WF#dl.cn(
请用
@
替代
#)
1 .Net Framework 3.0 简介及开发环境
1.1
.Net Framework 3.0
简介
相信大家对
.Net Framework 3.0
已经不再陌生了吧,具体的内容不用我介绍。我只是通过下面的一张图来对
.Net Framework 3.0
进行一个非常简单的介绍。
从图上我们可以看到 3.0 是以 .Net Framework 2.0 为核心,分别对不同技术和应用层面提供的一些模块。我记得一篇文章里面说到 .Net Framework 3.0 不应该叫 3.0 更确切的叫 .Net Framework 2.5 (哈哈!不知道大家是否赞同这个说法)。
在
.Net Framework 3.0
包含了四个模块:
WPF
(
Windows Presentation Foundation
):
WPF is a productive, unified approach to UI, Media, and Documents that you can use to deliver unmatched user experiences to your customers.
WPF
提供了一个统一
UI
、媒体和文档的用户体验。
WPF
统一了
WinForm
和
Web
的用户体验开发。
WCF
(
Windows Communication Foundation
):
Unified framework for rapidly building service-oriented applications
WCF
是一个迅速的建立
SOA
应用的框架。
WCF
集成了
WebService
、
Remotting
和
Com+
的一些特征。
WF
(
Windows Workflow Foundation
):
The Programming Model, Engine And Tools For Building Workflow Enabled Applications On Windows Platform.
在
Windows
平台上提供一个构建工作流程应用的模块、引擎和工具。
CardSpace
(
Windwos CardSpace
):
Technology that simplifies and improves the safety of online login and authentication.
CardSpace
是一个提供统一安全管理和身份认证的技术
通过上面简单的介绍,发现在
.Net Framework 3.0
中一个关键的内容就是统一和集成,微软希望是在
.Net Framework 3.0
开发时代不需要让开发人员费尽脑筋考虑是选择
WinForm
还是
Web
,使用
WebService
还是
Remotting
、
Com+
等等的技术难题,只需要按照
.Net Framework 3.0
的技术架构开发,就可以做到开发阶段的部署透明化(呵呵!多么美好的未来呀!!!)。
注:
如果你还对范型、不完整类、匿名委托等概念不清楚,那你需要疯狂充电了,因为在后面的例子中会经常使用这些技术的。
|
1.2
.Net Framework 3.0
开发环境
操作系统:
Windows XP SP2
开发工具和安装步骤:
1.
.Net Framework 2.0(
如果安装
VS2005
可以略过该步骤
)
2.
Visual studio 2005 (
可以使用
Express Edition)
3.
.NET Framework 3.0(WinFX) runtime components
。
(dotnetfx3setup.exe)
4.
Windows SDK--1G
左右
(6.0.6000.0.0.WindowsSDK_Vista_rtm.DVD.Rel.img)
5.
vsextwfx.msi
(是
VS2005
开发
WPF
、
WCF
的插件)
6.
Visual Studio 2005 Extensions for Windows Workflow Foundation (EN).exe (
是一个
WF
可视开发环境
)
注:
以上工具除了
Visual studio 2005
都可以到微软的网站上下载。
本文使用的例子大部分原自
SDK
,故请大家在安装
SDK
时选择
Sample
。
|
2 WF基础概念介绍
2.1
什么是
WF
什么是
WF
?这个问题相信大家也有一定的了解。
WF
是
Windows Workflow Foundation
的缩写,是微软为
Windows
平台开发工作流应用程序的一个模块、引擎和工具。这里借用微软的一些定义来具体描述
WF
。
Single workflow technology
for Windows
Base for Microsoft products and ISV/customer solutions
One technology for human and system workflow scenarios
A framework for building workflow into applications
A framework to build on - not an application or server
Exposed to developers via WinFX
从微软的定义来看我个人理解是:工作流是一种技术、是一个框架,微软通过这个技术和框架为客户(软件开发商)提供了一个工作流的解决方案。
注:
Windows Workflow Foundation
根据其英文名称应该缩写成
WWF
,但是微软为什么把他缩写为
WF
呢?感兴趣的网友可以在《程序员》
2006
年
11
月刊中找到答案。
|
2.2
WF
的Workflow模型
在
WF
中流程模型分为两种:
Sequential
(顺序)模型
|
Sequential
模型是流程按照事先预定的顺序执行,其中有可能存在分支(
IFELSE
)、循环(
WHILE
)等流程。
|
State Machine
(状态机)模型
|
State Machine
模型是以事件(
Event
)为驱动,使得流程本身转换不同的状态,每个状态有其转变的范围(即都可以转变成那些状态)和驱动事件。
|
两种模型及可以相互独立运行也可以互相包含,基于两种模型大家可以开发出复杂的业务逻辑和商业模型。
2.3
关键概念
我们还是以一个图来介绍
WF
的一些关键概念和
WF
的组成部分。
WF
包括了
Runtime Services
(运行时服务)、
Runtime Engine
(运行时引擎)、
Base Activity Library
(基础
Activity
库)。基于此我们要理解如下概念:
Workflows are a set of Activities
Workflows
是一个
Activity
的集合
Workflows run within a Host Process: any application or server
Workflows
需要寄宿在一个进程中,任何的应用或者服务都可以是
Workflow
的宿主
Developers can build their own Custom Activity Libraries
开发人员可以构建自己的
Activity
类库
Base Activity Library
Out-of-box activities and base for custom activities
基础的
Activity
类库,是自定义
Activity
的基类
Runtime Engine
Workflow execution and state management
负责
Workflow
的执行和管理的引擎
Runtime Services
Hosting flexibility and communication
负责
Workflow
寄宿和通讯的服务
Visual Designer
Graphical and code-based construction
一个图形化的设计器
通过这些概念我们了解到一个
Workflow
是由多个
Activity
组成,这些
Activity
可以
WF
中预定义的基础
Activity
也可以是用户自定义的
Activity
;
Workflow
需要有自己的
Runtime
,这个
Runtime
负责了
Workflow
的执行、管理和通讯。
这里有一个非常重要的概念就是
Activity
。所有的
Workflow
都是由
Activity
组成,那么什么是
Activity
呢?接下来我会向大家介绍。
2.4
什么是
Activity
我们可以从两个方面理解
Activity
:
Activities are the building blocks of workflows
Activity
是
workflow
一个已经编译的模块
The unit of execution, re-use and composition
是一个可执行的、可重用和可以组合的单元
Basic activities are steps within a workflow
基础的
Activity
是
Workflow
的一个步骤
Composite activities contains other activities EG: Sequence
复杂的
Activity
可以包含其他的
Activity
,例如:
Sequence
(一个
WF
预定义的
Activity
)
Partners and customers author custom activities EG: “ApproveOrder”
Activity
可以是合作伙伴或者客户提供的一个自定义的
Activity
,这个
Activity
可能完成一些特定的商业逻辑,例如:“
ApproveOrder
”
Activities are classes:
Properties
and events are defined by the activity author and programmable from workflows
可以在
Activity
中定义属性和事件由
workflow
使用
Has methods that are coded by the activity author but invoked by the workflow runtime (EG: Execute) or designer
Activity
中的方法是由
Activity
的作者实现(如:
Execute
),由
workflow
或则设计器进行调用
Can be built into workflow assemblies or deployed as re-usable libraries
可以编译在
workflow
中或则作为可重用库依赖于
workflow
下面代码演示了一个
Activity
的例子:
public partial class SendEmailActivity :
System.Workflow.ComponentModel.Activity
{
public SendEmailActivity()
{
............
}
// override Execute with your custom logic
protected override ActivityExecutionStatus
Execute(ActivityExecutionContext context)
{
// you custom logic
return ActivityExecutionStatus.Closed;
}
//property
public string To
{
get{........;}
set{........;}
}
//event
public event EventHandler<CustomActivityEventArgs> Sending
{
add{........}
remove{........}
}
}
|
这里面一直在重点强调
Activity
的是重用,可以说一个
Activity
的最重要之处就是重用。重用不单单是代码的重用,而是业务逻辑的重用,这也是工作流应用的灵活之处。在开发工作流应用的时候,怎样划分业务逻辑?业务逻辑的颗粒度有多细?
WF
并没有规定,况且这个问题是仁者见仁,智者见智,并没有一个统一的定论。
个人的理解在定义一个
Activity
时要做到第一可重用、第二松耦合。在本文中只是对
WF
的组成和工作原理进行简单的介绍,不会深入讨论业务逻辑的划分和定义,我想即使不使用
WF
,业务系统也会遇到同样的问题。
2.5
Activity
的其他概念
在自定义
Activity
时还有几个比较重要的概念,分别是
Designer
、
ActivityValidator
、
CodeGenerator
、
Serializer
、
ToolboxItem
和定义行为的
SupportsTransaction
、
SupportsExceptionHandlers
。实际上这些该是
Activity
的
Attribute
类,分别制定了
Activity
在设计器中的
UI
界面、对
Activity
在设计期间的完整性校验、
Activity
的序列化等操作。具体内容我会在后面章节具体介绍,这里只介绍如何使用。
[Designer(typeof(CustomActivityDesinger),typeof(IDesigner))]
[ActivityValidator(typeof(SendEmailValidator))]
public partial class SendEmailActivity :
System.Workflow.ComponentModel.Activity
{
......
}
public class CustomActivityDesinger : ActivityDesigner
{
......
}
public class SendEmailValidator :
System.Workflow.ComponentModel.Compiler.ActivityValidator
{
......
}
|
2.6
Activity
分类
现在提供的
Activity
大约有
28
种,分成
8
类:
1:
Control Flow Activity
:控制流程类
2:
Workflow Lifetime Activity
:工作流相关
3:
Event Waiting Activity
:事件类
4:
Transaction and Exception Activity
:事务和异常处理类
5:
Data-Centic Activity
:数据(交换)处理类
6:
WebService Activity
:
WeSerivice
的处理
7:
The Code Activity
:代码处理类
8:
State Workflow Activity
:状态机工作流处理类
9:
其它,
Custom Activity
:用户自定义类
分类中具体的
Activity
如下:
1:
Control Flow Activity
:控制流程类
Sequence Activity
:顺序流程
Parallel Activity
:并行流程
IfElse Activity
:条件判断流程
While Activity
:循环流程
ConditionedActivityGroup
:条件组
Replicator Activity
:自我复制。可以在运行中自我复制实例。
Delay Activity
:延时执行。
2:
Workflow Lifetime Activity
:工作流相关
InvokeWorkflow Activity
:调用执行另外的工作流
Suspend Activity
:暂停当前执行的工作流
Terminate Activity
:中止工作流
3:
Event Waiting Activity
:事件类
EventDriven Activity
:等待事件驱动。指定要等待处理的事件名,参数等
Listen Activity
:侦听消息。这个可以同时侦听很多消息。一个
Listin
里面有多个
EventDriven
。
4:
Transaction and Exception Activity
:事务和异常处理类
Transaction Context Activity
:处理事务中的上下文,支持短期、长期的事务。
Throw Activity
:抛出异常
ExceptionHandler
:异常处理。
Compensate Activity
:补偿处理,只能放在
Exception
中,处理一些回滚处理等。
5:
Data-Centic Activity
:数据(交换)处理类:用于
WF
处理空间和
Host
空间之间的数据交换。
UpdateData Activity
:
WF
把数据更新到
Host
SelectData Activity
:
WF
发向
Host
的请求
WaitForData Activity
:
WaitForQuery Activity
:
Host
发向
WF
,
WF
返回
DataSource
6:
WebService Activity
:
WeSerivice
的处理
InvokeWebService Activity
:调用
WebService
WebServiceReceive Activity
WebServiceResponse Activity
7:
The Code Activity
:代码处理类
Code Activity
:可写一些代码。但是我不觉得这样的处理好,因为这样的逻辑有点写死进程序里了。
8:
State Workflow Activity
:状态机工作流处理类
State
:状态。状态机的一个状态。一个工作流必须有个初始状态,有个结束状态。
StateInitialization
:初始状态。我好像没用过这个
SetState
:设置下一个状态。
9:
Custom Activity
:用户自定义状态。
Feedback
# re: Kilxy的WF(Windows Workflow Foundation)学习手记(一) 回复 更多评论
2006-12-15 15:33 by *悟*道*
好东西。。。
支持。。。
支持。。。
# re: Kilxy的WF(Windows Workflow Foundation)学习手记(一) 回复 更多评论
2006-12-15 15:43 by neuhawk
问一下,在很多时候,比如审批事件,我们也要做很多数据操作,怎么样才能让我自己的业务跟wf的事件保持事务,当然 我的是sql 2000,并不能用dtc的.
# re: Kilxy的WF(Windows Workflow Foundation)学习手记(一) 回复 更多评论
2006-12-15 16:04 by kilxy
@neuhawk
首先Activity是支持事务的如Transaction Context Activity:处理事务中的上下文,支持短期、长期的事务。
如果这个还不能满足可以使用WF的补偿机制进行处理。
我后面会继续介绍一些Activity的使用,到时应该可以解答你的问题。
首先Activity是支持事务的如Transaction Context Activity:处理事务中的上下文,支持短期、长期的事务。
如果这个还不能满足可以使用WF的补偿机制进行处理。
我后面会继续介绍一些Activity的使用,到时应该可以解答你的问题。
# re: Kilxy的WF(Windows Workflow Foundation)学习手记(一) 回复 更多评论
2006-12-15 16:08 by neuhawk
不太可能用Transaction Context Activity事务.
# re: Kilxy的WF(Windows Workflow Foundation)学习手记(一) 回复 更多评论
2006-12-15 17:56 by 西门子乌
好像是beta版本的,RTM的没看到
5:Data-Centic Activity
5:Data-Centic Activity
# re: Kilxy的WF(Windows Workflow Foundation)学习手记(一) 回复 更多评论
2006-12-16 09:41 by KiddLee
继续关注
# re: Kilxy的WF(Windows Workflow Foundation)学习手记(一) 回复 更多评论
2006-12-16 14:10 by 远航
一定关注
# re: Kilxy的WF(Windows Workflow Foundation)学习手记(一) 回复 更多评论
2006-12-16 22:30 by 芭蕉
指出一个错误
不是两种模型,而是三种,还有一种叫data driven
不是两种模型,而是三种,还有一种叫data driven
强烈建议大家看看这篇文章 http://blogs.msdn.com/davegreen/archive/2005/10/20/483309.aspx
虽然比较老了,但对于如何选择模型说的非常好,楼主也可以把其翻译了和园子里的朋友共享哈 :)
虽然比较老了,但对于如何选择模型说的非常好,楼主也可以把其翻译了和园子里的朋友共享哈 :)
# re: Kilxy的WF(Windows Workflow Foundation)学习手记(一) 回复 更多评论
2006-12-17 21:14 by 锦瑟
楼主能否介绍一些wpf的相关内容?
# re: Kilxy的WF(Windows Workflow Foundation)学习手记(一) 回复 更多评论
2006-12-28 09:49 by 纶巾客
观注
# re: Kilxy的WF(Windows Workflow Foundation)学习手记(一) 回复 更多评论
2007-01-10 11:56 by 虫子[匿名]
多么美好的未来呀.
^_^
^_^
# re: Kilxy的WF(Windows Workflow Foundation)学习手记(一) 回复 更多评论
2007-01-10 13:53 by 虫子[匿名]
关注
# re: Kilxy的WF(Windows Workflow Foundation)学习手记(一) 回复 更多评论
2007-04-27 15:09 by freeliver54
Mark 谢谢!