标签:工作流 动态生成xoml文件
工作流就是业务信息数据在多个环节模块之间的流转,Work翻译为任务、工作等,flow则 翻译为流程、流动等。Flow反映的是一种事物的动态属性或变化过程,例如水的流动被称为水流,空气的流动被称为气流,还有物料流、资金流等,在抽象领域还有信息流、控制流等,因此,使用任务、活动以及活动之间的变化过程表示业务流程就被称为工作流。
工作流在应用上面,我觉得更像是“面向对象”的东西,将一个一个的对象封装起来,通过某种业务,有目的、有规律的将他们联系在一起,我觉的就是工作流。
这是一张业务流的工作流模板:
这张模板的生成,我们讲各个活动写好后,生成的活动从工具箱里面拖过来使用的,那么问题就来了,我们不想要为每一个工作流都配置模板,我想要写出Activity,来根据不同的参数和顺序,将工作流联系在一起,动态生成数据流的模板。
我查了一些资料,遗憾的是没有查到动态生成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,传递给它不同的参数,按顺序添加到代码中,就可以拼接一个工作流,大大增加了代码的复用和工作流模板的复用。
标签:工作流 动态生成xoml文件
原文地址:http://blog.csdn.net/qiumuxia0921/article/details/44779411