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

  • 相关阅读:
    Vue中事件委托的使用
    java提取每个汉字的首字母
    想把大脑存进电脑,我为什么要写博客
    CF 1606 D题题解
    js前端 音频波形图像展示
    js前端 仪表盘实现
    js前端 bootstrap select的使用
    UOS系统维护命令
    linux 打印机管理常用命令
    linux 调用shell命令
  • 原文地址:https://www.cnblogs.com/carysun/p/CustomeActivity.html
Copyright © 2020-2023  润新知