《WF编程》系列之13 - XAML激活

2.3.3 XAML激活

在有些环境中,编译过程会变成一种负担.想象一下,数据库中包含了上千个为特定用户量身打造的工作流定义.在这种情形下,我们也许想要避免总是创建新的程序集而引起的性能消耗.而我们需要的就是以最低的开销加载工作流,然后执行.幸运的是,这正是以纯XAML方式编写工作流的优点.

如果要激活之前创建的工作流,我们需要调整一下XOML文件.之前我们在XOML文件中使用x:Class特性来告诉编译器工作流定义中类型的名称,而现在编译器并不会创建新的类,因为XAML根本不会经历编译阶段.请注意之前我们通过WorkflowMarkupSerializer创建的XAML并不包含x:Class特性.

< SequentialWorkflowActivity 

  
xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/workflow"  

  xmlns:otc
="http://schemas.OdeToCode.com/WinWF/Activities" >

  
< otc:WriteLineActivity  Message ="Hello, workflow!" />

</ SequentialWorkflowActivity >

 

激活机制只对完全定义在工作流标记中的工作流有效.因为不用经过编译阶段,我们不得不放弃一些XAML名称空间提供的功能(如内嵌代码).对于CLR对象来说,XAML是有效的XML序列化格式,所以激活机制只不过直接从XAML创建了一个对象层次结构(object hierarchy).

激活通过WorkflowRuntime中的CreateWorkflow方法来启用.我们要使用CreateWorkflow方法的另外一个重载,要传递的参数不是类型对象,而使一个XmlReader,我们要通过XmlReader来把工作流标记以流的方式传给Runtime.

using  (WorkflowRuntime runtime  =   new  WorkflowRuntime())

using  (AutoResetEvent waitHandle  =   new  AutoResetEvent( false ))

{

   runtime.WorkflowCompleted 
+=   delegate  { waitHandle.Set(); };

   runtime.WorkflowTerminated 
+=   delegate  { waitHandle.Set(); };

   TypeProvider typeProvider 
=   new  TypeProvider(runtime);

   typeProvider.AddAssembly(Assembly.GetExecutingAssembly());

   runtime.AddService(typeProvider);


   WorkflowInstance instance 
=  runtime.CreateWorkflow(reader);

   instance.Start();

   waitHandle.WaitOne();

}

编译XOML文件时,我们可以指定一个程序集引用来指向包含自定义活动WriteLineActivity的程序集.当激活工作流时,Runtime仍然需要定位自定义活动的程序集,这时我们需要使用一个TypeProvider服务.TypeProvider会保持工作流激活所需的程序集引用,Runtime依赖TypeProvider服务来确定类型和程序集.在上边的代码中,我们以程序集引用的方式添加了正在执行的程序集.

在使用激活工作流之前还需要考虑版本带来的影响.当工作流编译之后,我们可以提供程序集版本和其它元数据来标识程序集,也可以提供一个强名称来唯一地标识程序集并防止程序集被篡改.但是在另一方面,XOML文件没有内置的版本结构,所以如果我们需要版本或者密码保护,我们需要写一些自定义代码.

纯XAML小结

我们讲述了几种生成纯XAML解决方案.如果我们需要一个轻量级的方式来创建新的工作流,那么采用纯XAML方式并结合工作流激活功能是合适的选择.但如果我们需要用C#或者Visual Basic代码扩充工作流,纯XAML方式就不能很好的工作了.下一节,我们看一下结合XAML和代码.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值