工作流文件从编译到运行编译

(一)概念:


工作流就是业务信息数据在多个环节模块之间的流转,Work翻译为任务、工作等,flow则 翻译为流程、流动等。Flow反映的是一种事物的动态属性或变化过程,例如水的流动被称为水流,空气的流动被称为气流,还有物料流、资金流等,在抽象领域还有信息流、控制流等,因此,使用任务、活动以及活动之间的变化过程表示业务流程就被称为工作流。


(二)个人理解:


工作流在应用上面,我觉得更像是“面向对象”的东西,将一个一个的对象封装起来,通过某种业务,有目的、有规律的将他们联系在一起,我觉的就是工作流。


(三)定义的工作流模板:


这是一张业务流的工作流模板:



这张模板的生成,我们讲各个活动写好后,生成的活动从工具箱里面拖过来使用的,那么问题就来了,我们不想要为每一个工作流都配置模板,我想要写出Activity,来根据不同的参数和顺序,将工作流联系在一起,动态生成数据流的模板。


(四)动态生成xoml文件


我查了一些资料,遗憾的是没有查到动态生成xaml文件的,有xoml文件的,我做一个小Demo,期望之后能做成我们想象中的那个样子的工作流。


1、在vs中添加一个类库

2、添加一个类,插入代码:


<span style="font-family:SimSun;font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Workflow.ComponentModel.Compiler;//这是编译时会用到的
using System.Workflow.ComponentModel.Serialization;//这个是保存XOML会用到的
using System.Workflow.Activities;
using System.Xml;
using System.IO;

namespace WfTest1
{
    public class Program
    {
        static void Main(string[] args)
        {

            //WFCreat();    //生成XOML文件的DLL文件

            ///动态创建工作流的XOML文件
            SequenceActivity myworkflow = new SequenceActivity("Test");
            myworkflow.Name = "MyWorkflow";
            myworkflow.SetValue(WorkflowMarkupSerializer.XClassProperty, typeof(SequenceActivity).FullName);
            DelayActivity d = new DelayActivity("delay");
            CodeActivity c = new CodeActivity("codeActivity");
            SetStateActivity s1 = new SetStateActivity("setstateActivity");
            d.TimeoutDuration = new TimeSpan(0, 0, 10);
            s1.TargetStateName = "setstateActivity";
</span><pre name="code" class="csharp"><span style="font-family:SimSun;font-size:18px;">            myworkflow.Activities.Add(d);
            myworkflow.Activities.Add(c);
            myworkflow.Activities.Add(s1);
            using (XmlWriter xw = XmlWriter.Create("Test.xoml"))
            {
                WorkflowMarkupSerializer s = new WorkflowMarkupSerializer();
                s.Serialize(xw, myworkflow);
            }

            ///以上代码虽然可以生成一个xoml,但却不能进行编译,所以还需要我们强制添加下面的一个attribute

            XmlDocument doc = new XmlDocument();
            doc.Load("Test.xoml");

            XmlAttribute attrib = doc.CreateAttribute("x", "Class", "http://schemas.microsoft.com/winfx/2006/xaml");
            attrib.Value = typeof(Program).Namespace + ".MyWorkflow"; //注意这个名称

            doc.DocumentElement.Attributes.Append(attrib);
            doc.Save("Test.xoml"); 
        }

        public static void WFCreat()
        {
            WorkflowCompiler compiler = new WorkflowCompiler();
            WorkflowCompilerParameters p = new WorkflowCompilerParameters();
            p.OutputAssembly = "test.dll";
            WorkflowCompilerResults r = compiler.Compile(p, "test.xoml");
            foreach (var item in r.Errors)
            {
                Console.WriteLine(item);
            }
        }
    }
}
</span>

 

在上面的代码中,我们可以看到,其实我是添加了三个Activity,并且他们的顺序也在代码中显示了,是这样的:


<span style="font-family:SimSun;font-size:18px;">            DelayActivity d = new DelayActivity("delay");
            CodeActivity c = new CodeActivity("codeActivity");
            SetStateActivity s1 = new SetStateActivity("setstateActivity");</span>

顺序:

<span style="font-family:SimSun;font-size:18px;">            myworkflow.Activities.Add(d);
            myworkflow.Activities.Add(c);
            myworkflow.Activities.Add(s1);</span>


运行之后,会在bin\Debug文件夹下生成多个文件:



我们讲里面的Test.xoml文件放在我们的程序里面,打开时这样的:



这样一个没有经过加工的工作流出来了,这样,我们就可以看到,我没有进行配置模板的,通过运行实现的工作流的实现。从上面可以看出,这是讲编译时调到了运行时编译。


总结


可能会有人问,这有什么好处呢?其实很简单,这是一种抽象和封装的思想,我们讲代码复用到,可以通过参数来进行组合工作流,要远远比手动拖拽将工作流组合起来的耦合度低很多,而且,我只要通过写Activity,传递给它不同的参数,按顺序添加到代码中,就可以拼接一个工作流,大大增加了代码的复用和工作流模板的复用。



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值