一:程序集,命名空间,活动变化
WF4并非是在原有WF3.x上的改进,而是全新的开发有新的命名空间,程序集,原WF3的部分会继续保留这主要是为了兼容,下面的表格告诉你具体的变化:
1.程序集的变化
WF3.x程序集 | WF4程序集 |
System.Workflow.Activities.dll | System.Activities.dll |
System.Workflow.ComponentModel.dll | System.Activities.dll |
System.WorkflowServices.dll | System.ServiceModel.Activities.dll |
2.名空间的变化
WF3.x命名空间 | WF4命名空间 |
System.Workflow.Activities | System.Activities.Statements |
System.Workflow.ComponentModel | System.Activities |
System.WorkflowServices | System.ServiceModel.Activities |
3.活动的变化
WF3.x活动 | WF4活动 |
CallExternalMethodActivity | Send |
CancellationHandlerActivity | CancellationScope |
CodeActivity |
CodeActivity/NativeActivity |
CompensateActivity | Compensate |
CompensatableSequenceActivity | CompensableActivity |
ConditionedActivityGroup | 可通过其他方式实现 |
DelayActivity | Delay |
EventHandlingScopeActivity | 暂无 |
FaultHandlersActivity | TryCatch |
HandleExternalEventActivity | Receive |
IfElseActivity | If |
InvokeWebServiceActivity | Send |
InvokeWorkflowActivity | 暂无 |
ListenActivity | Pick |
ParallelActivity | Parallel |
PolicyActivity | 暂无 |
ReplicatorActivity | ForEach, ParallelForEach |
SendActivity | Send |
ReceiveActivity | Receive |
SequenceActivity, SequentialWorkflowActivity | Sequence |
StateMachineWorkflowActivity | 暂无 |
SuspendActivity | 无 |
SynchronizationScopeActivity | 无 |
TerminateActivity | 无 |
ThrowActivity | Throw |
TransactionScopeActivity | TransactionScope |
CompensatableTransactionScopeActivity | TransactionScope + CompensableActivity |
WebServiceFaultActivity | 整合为工作流服务 |
WebServiceInputActivity | 整合为工作流服务 |
WebServiceOutputActivity | 整合为工作流服务 |
WhileActivity | While |
二:自定义活动
1.活动基类继承关系:
2.WorkflowElement 是所有活动的基类,Activity,CodeActivity,DynamicActivity,NativeActivity活动均继承于该类,DynamicActivity是Sealed不能用于
自定义活动。
3.可以使用设计器方式来可视化的设计自定义活动,如下图:
4.使用代码的方式创建自定义活动,我们需要继承自CodeActivity和NativeActivity活动,这两个活动的区别是他们的Execute方法所带的上下文环境不同,
CodeActivity为CodeActivityContext,它只是一个简化版的上下文环境,对Runtime没有完全的访问权限,而NativeActivity的上下文环境
ActivityExecutionContext,ActivityExecutionContext支持scheduling,取消子活动的执行,持久化的支持,书签的支持等等对runtime有完全的访问权限。
5.CodeActivity和NativeActivity都有泛型版的,一般我们在创建需要返回值的活动时使用泛型版本,泛型版本的已经有一个OutArgument<TResult>的变量,
这个我们可以通过反编译WorkflowElement<TResult>看出,如下:
[TypeConverter(typeof(ValueExpressionConverter)), ValueSerializer(typeof(ValueExpressionValueSerializer))] public abstract class WorkflowElement<TResult> : WorkflowElement, IActivityWithResult { // Fields private OutArgument<TResult> result; // Methods internal WorkflowElement(); internal void ExecuteWithTryGetValue(ActivityContext context); public static WorkflowElement<TResult> FromValue(TResult constValue); public static WorkflowElement<TResult> FromVariable(Variable variable); public static WorkflowElement<TResult> FromVariable(Variable<TResult> variable); internal IList<RuntimeArgument> GetValueExpressionArguments(); public static implicit operator WorkflowElement<TResult>(Variable<TResult> variable); public static implicit operator WorkflowElement<TResult>(TResult constValue); public static implicit operator WorkflowElement<TResult>(Variable variable); internal virtual bool TryGetValue(LocationEnvironment environment, out TResult value); // Properties [DefaultValue((string) null)] public OutArgument<TResult> Result { get; set; } Type IActivityWithResult.ExpressionType { get; } OutArgument IActivityWithResult.Result { get; set; } }
6.与WF3.x中开发自定义活动不同的是在WF3中我们使用依赖属性来绑定数据,在WF4中我们使用In参数或Out参数及变量代替。另外在WF3.x中我们重写
Execute方法时需要返回ActivityExecutionState,WF4中不需要返回值,因为WF4的Runtime会自动判断,透明了。
相关文章:
WF4.0 Beta1之旅(1):基本介绍
WF4.0 Beta1之旅(2):异常处理
WF4.0 Beta1之旅(3):全新的FlowChart
WF4.0 Beta1之旅(4):Bookmark的使用
WF4.0 Beta1之旅(5):规则引擎的变化