`

WF4.0 Beta1之旅(6):自定义活动

阅读更多

一:程序集,命名空间,活动变化

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):规则引擎的变化

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics