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与WF3.x在程序集、命名空间和活动等方面的差异,并介绍了WF4中自定义活动的开发方法。


被折叠的 条评论
为什么被折叠?



