`

无代码的工作流创作模式

阅读更多

工作流创作模式

WF中有三种工作流创作模式:

仅限代码:纯使用代码的方式,比如我们创建一个Workflow1.会产生Workflow1.cs和Workflow1.Desiger.cs两个文件。后者是自动生成的。前者是我们
实现逻辑和设计工作流的地方。如果有规则的话,会产生一个序列化的.rules文件。当项目生成的时候,该.rules文件会作为程序集的嵌入式资源。这种
方式在运行时只能通过动态更新来更改.

代码分离:.xoml格式,这种方式的工作流序列化后保存在一个以.xoml为扩展名的文件中,它的代码保存在.xoml.cs中。这种模式在生成的时候会先由
工作流编译器从.xoml文件生成临时的C#类,在和.xoml.cs一起编译。

无代码:只有一个.xoml文件。这种模式在VS模板中是不支持的,在这种模式下只能使用已经存在的工作流类型和成员。请看下图:

NoCode

从上图中我们可以很清楚的该模式的特点,这种模式有很大的灵活性,可以通过宿主程序将工作流标记文件加载到工作流运行时引擎。不需要重新编
译整个工作流。我们下面来说明如何使用该种方式。

1.首先我们自定义一个工作流基类提供工作流中需要的属性和方法,代码如下:

using System;
using System.Workflow.Activities;
namespace CaryWFLib
{
    public class CaryBaseWorkflow : SequentialWorkflowActivity
    {
        public int Number { get; set; }

        public void Condition(object sender, ConditionalEventArgs e)
        {
            e.Result = (Number > 0);
        }
    }
}
2.然后我们实现一个自定义活动CaryPrintActivity完成逻辑部分,主要功能输出Message,代码如下:
namespace CaryWFLib
{
    public partial class CaryPrintActivity: Activity
    {
        public static DependencyProperty MessageProperty
            = System.Workflow.ComponentModel.DependencyProperty.Register(
                "Message", typeof(String), typeof(CaryPrintActivity));

        [Description("A string message to write")]
        [Category("Pro Workflow")]
        [Browsable(true)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public String Message
        {
            get
            {
                return ((String)(base.GetValue(CaryPrintActivity.MessageProperty)));
            }
            set
            {
                base.SetValue(CaryPrintActivity.MessageProperty, value);
            }
        }

        public CaryPrintActivity()
        {
            InitializeComponent();
        }

        protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
        {
            if (Message != null)
            {
                Console.WriteLine(Message);
            }
            return base.Execute(executionContext);
        }
    }
}

3.然后我们来实现无代码的工作流部分,代码如下:
<?xml version="1.0" encoding="utf-8" ?>
<ns0:CaryBaseWorkflow
x:Name="CaryNoCodeWorkflow"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/workflow"
xmlns:ns0="clr-namespace:CaryWFLib;Assembly=CaryWFLib">
    <IfElseActivity x:Name="ifElseActivity1">
        <IfElseBranchActivity x:Name="ifElseBranchActivity1">
            <IfElseBranchActivity.Condition>
                <CodeCondition Condition="{ActivityBind Name=CaryNoCodeWorkflow,Path=Condition}" />
            </IfElseBranchActivity.Condition>
            <ns0:CaryPrintActivity Message="您输入的数字大于0" x:Name="caryPrintActivity1" />
        </IfElseBranchActivity>
        <IfElseBranchActivity x:Name="ifElseBranchActivity2">
            <ns0:CaryPrintActivity Message="您输入的数字小于等于0" x:Name="caryPrintActivity2" />
        </IfElseBranchActivity>
    </IfElseActivity>
</ns0:CaryBaseWorkflow>

注意
3.1.根节点为ns0:CaryBaseWorkflow,和活动条件的绑定部分。
3.2.无代码的工作流创作模式下不能包含X:Class属性。
3.3.如果规则为声明性规则即.rules的形式,上面的条件部分应该为:
<RuleConditionReferenceConditionName="Condition" />

3.4.需要将该工作流文件属性的生成操作设置为无。

4.宿主部分:

namespace NoCodeWorkflow
{
    class Program
    {
        static void Main(string[] args)
        {
            using (WorkflowRuntime workflowRuntime = new WorkflowRuntime())
            {
                AutoResetEvent waitHandle = new AutoResetEvent(false);
                workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) 
{ waitHandle.Set(); }; workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e) { Console.WriteLine(e.Exception.Message); waitHandle.Set(); }; Dictionary<String, object> paras = new Dictionary<string, object>(); paras.Add("Number", 2); try { //XmlReader reader = XmlReader.Create("..\\..\\CaryNoCodeWorkflow.xoml"); XmlReader reader = XmlReader.Create("..\\..\\CaryNoCodeRulesWorkflow.xoml"); XmlReader readerRule = XmlReader.Create("..\\..\\CaryNoCodeRulesWorkflow.rules"); //WorkflowInstance instance = workflowRuntime.CreateWorkflow(reader, null, paras); WorkflowInstance instance = workflowRuntime.CreateWorkflow(reader, readerRule, paras); instance.Start(); } catch (WorkflowValidationFailedException ex) { foreach (ValidationError error in ex.Errors) { Console.WriteLine(error.ErrorText); } } catch (Exception ex) { Console.WriteLine(ex.Message); } waitHandle.WaitOne(); } } } }
在宿主程序中,我们使用workflowRuntime.CreateWorkflow的另一种重载。最后结果如下:
NoCode1 

分享到:
评论

相关推荐

    人工智能驱动的纹理创作软件_Haxe_代码_下载

    5. **批量处理**:对于需要处理大量纹理的工作流,ArmorLab支持批处理模式,可以快速生成或修改多个纹理,大大提高生产力。 6. **兼容性**: ArmorLab生成的纹理兼容多种格式,如.png、.tiff等,确保它们能在各种...

    opencms7.53源代码

    它基于Java技术栈,提供了一套全面的功能,包括内容创作、版本控制、工作流管理、多语言支持等。标题提到的是OpenCms的7.5.3版本,这是一个相对较老的版本,但在某些情况下可能仍被使用,比如为了维护旧项目或研究...

    带代码编辑的tinymce编辑器

    ** Tinymce 编辑器详解 ** ...了解并熟练运用 Tinymce,无论是开发 Web 应用还是进行内容创作,都能极大地提高工作效率和用户体验。通过社区共享的精神,Tinymce 不断进化,持续为开发者提供更好的工具和服务。

    基于Java的影视创作论坛的设计与实现

    3. **MVC模式**:理解模型-视图-控制器设计模式,如何将业务逻辑、数据显示和用户交互分离,提高代码可维护性。 4. **Web容器**:如Tomcat或Jetty,它们提供运行Java EE应用的环境,管理Servlet和JSP的生命周期。 ...

    代码大全(第2版)

    - **写作创作**:将编写代码看作是写作创作过程,注重表达清晰度和逻辑结构。 #### 四、上游先决条件的测量 **1. 确定软件类型** - 在开始编码之前,明确项目的目标、规模和预期用户群体。 - 这有助于制定更为...

    坚持学习WF,WF学习教程

    坚持学习WF(2):WF创作模式和设计时工具 坚持学习WF(3):WF框架概览 2.3两篇主要全面的阐述了WF框架和Visual Studio对开发WF的一些设计时的工具。 坚持学习WF(4):活动(Activity)和依赖属性(DependencyProperty) ...

    坚持学习WF

    坚持学习WF(2):WF创作模式和设计时工具 坚持学习WF(3):WF框架概览 2.3两篇主要全面的阐述了WF框架和Visual Studio对开发WF的一些设计时的工具。 坚持学习WF(4):活动(Activity)和依赖属性(DependencyProperty) ...

    Python-GuitarScaleChart一个24英尺吉他比例图表用于许多流行的音阶模式和按键

    Python-GuitarScaleChart的工作原理是通过算法生成音阶模式,并以图形化的方式展示出来。开发者可能使用了Python的图形库,如matplotlib或tkinter,来创建交互式的图表。用户可以选择不同的音阶、模式和调性,程序会...

    authorware 实例源文件 彩珠游戏源代码

    打开".a7p"文件,我们可以看到Authorware的工作流图,其中每个图标对应着不同的功能模块。 4. 主要图标解析: - "Initialize"图标:用于初始化游戏状态,如设置分数、游戏难度、彩珠位置等。 - "User Interaction...

    Orchard MVC 1.6 源代码

    3. **工作流支持**:Orchard MVC内置了工作流引擎,可以用于实现复杂的业务逻辑,如内容审批流程、用户权限管理等。 4. **内容管理系统**:作为CMS,Orchard MVC提供了丰富的内容管理功能,包括内容类型定义、内容...

    TakeColor+取色器.zip

    对于频繁需要取色的用户,这样的个性化设置能大大提高工作流的效率。 在操作上,TakeColor取色器保持了极简的设计风格。界面直观,易于上手,无论是初学者还是经验丰富的专业人员都能快速适应。而且,作为一个独立...

    计算机程序源代码.pdf

    总的来说,源代码是程序员创作软件的心脏,包含了程序的逻辑、结构和控制流。在这个案例中,我们看到了如何使用MFC来构建一个简单的Windows GUI应用程序,并通过源代码理解其内部工作原理。这种编程方式对于学习...

    java技术做的50个毕业设计,创作为近两年。主要技术为jsp

    在给定的压缩包文件中,可以看到一些可能的项目源码,如"jbpmFlow.rar"可能涉及到工作流管理系统,使用了Business Process Execution Language (BPEL) 或者Java Business Process Management (jBPM) 技术。...

    华为自动化培训视频.rar

    05华为云开发工作流实验mp4 06JsON数据格式mp4 07SON实验mp4 08XM数据格式m 09XML实验mp4 10YAML数据格式mp4 11YAML实验mp4 12模型化编程理论mp4 13 NetConf编程实验mp4 14 Telemetry技术介绍mp4 15 Telemetry与gRPC...

    avs解码源代码 + AvsTransCoder_2.0.01.exe

    开发者可以通过阅读和分析这些源代码,了解AVS编码的内部工作机制,包括熵编码的H.264类似结构、运动估计和补偿策略、帧间和帧内预测模式等。此外,源代码也可能包含错误处理、内存管理以及与硬件加速接口的集成等...

    漂亮的简单的超文本编辑器

    标题中的“漂亮的简单的超文本编辑器”暗示我们讨论的是一款设计简洁、易用的文本编辑软件,主要用于...同时,我们也会涉及自定义编辑器的可能性,包括自定义功能、集成特定工作流等,以满足不同开发者的个性化需求。

    Typora-超好用的笔记工具

    总的来说,Typora是一款高效、易用且功能强大的笔记工具,无论你是初学者还是经验丰富的Markdown用户,都能在其中找到适合自己的工作流。它将Markdown的简洁性和富文本的呈现完美结合,为内容创作者提供了一种全新的...

    spacedesk.zip【含两套版本】win7/win8/win10/android

    总的来说,spacedesk是一个极具创新性和实用性的工具,它打破了传统桌面环境的局限,将移动设备巧妙地融入到多屏工作流中,让工作和创作变得更加灵活和高效。无论您是在家中还是办公室,只要有合适的设备,就能轻松...

    资源下载源码出售视频教程付费观看模板手机自适应利于seo带暗夜模式切换.txt

    对于从事相关领域工作的专业人士而言,掌握这些知识点不仅能帮助他们更好地完成工作,还有助于开拓新的业务方向。例如,开发者可以通过制作并出售高质量的视频教程或付费观看模板来增加收入;网站管理员则可以通过...

Global site tag (gtag.js) - Google Analytics