WF4.0:四种自定义类型活动

简介:

  工作流中的活动就像用户自定义的控件,将许多的功能封装起来用。WF4.0中提供了四种可继承的活动类:CodeActivity 、AsyncCodeActivity、Activity、NativeActivity。这几种活动都有自己使用的适合场合,正确的使用这些活动将非常有利。

1、CodeActivity

     WF4.0中的活动是树形结构的,创建叶子活动最简单是方式就是使用CodeActivity ,它的逻辑都放在一个方法:Execute 里面,这个也是四种活动中最简单的一种。这里用一个简单的自定活动HttpGet来说明怎么使用CodeActivity。HttpGet的功能是从网络上抓取数据。

复制代码
     public   sealed   class  HttpGet : CodeActivity < string >
    {
        
public  InArgument < string >  Uri {  get set ; }

        
protected   override   string  Execute(CodeActivityContext context)
        {
            WebRequest request 
=  HttpWebRequest.Create( this .Uri.Get(context));

            
using  (WebResponse response  =  request.GetResponse())
            {
                
// read everything response.GetResponseStream() as one string
                 using  (StreamReader reader  =   new  StreamReader(response.GetResponseStream()))
                {
                    
return  reader.ReadToEnd();
                }
            }

        }

    }
复制代码

    public InArgument<string> Uri { get; set; }是工作流中的一个属性,相当于类的属性,不过取它的值与类有点不同,你需要使用:Uri.Get(context))或者context.GetValue(Uri),Execute方法是这个活动的逻辑,特别注意CodeActivityContext context参数,这是WF的上下文,非常有用。

如何使用这个活动:

 HttpGet fetchMsn  =   new  HttpGet
     {
         Uri 
=   " http://www.msn.com "
     };
     
string  msnContent  =  WorkflowInvoker.Invoke < string > (fetchMsn);
     Console.WriteLine(msnC
ontent);

2、AsyncCodeActivity

    AsyncCodeActivity 类似CodeActivity ,只是它是使用了 Begin/EndExecute 取代了CodeActivityExecute 方法。BeginExecute 开始一个异步操作,无需等待它完成,就返回IAsyncResult对象 。当这个操作完成的时候,就执行EndExecute 方法放回结果。HttpGet 能这样实现,请注意CodeActivityContext换成了AsyncCodeActivityContext:

复制代码
    class  HttpGet : AsyncCodeActivity < string >
    {
        
public  InArgument < string >  Uri {  get set ; }

        
protected   override  IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback,  object  state)
        {
            WebRequest request 
=  HttpWebRequest.Create( this .Uri.Get(context));
            context.UserState 
=  request;
            
return  request.BeginGetResponse(callback, state);            
        }

        
protected   override   string  EndExecute(AsyncCodeActivityContext context, IAsyncResult result)
        {
            WebRequest request 
=  (WebRequest)context.UserState;
            
using  (WebResponse response  =  request.EndGetResponse(result))
            {
                
using  (StreamReader reader  =   new  StreamReader(response.GetResponseStream()))
                {
                    
return  reader.ReadToEnd();
        
        }
            }
        }
    }
复制代码

3、Activity

    Activity可以以组合的方式定义活动。开发人员可以使用已有活动构建一个活动树来实现这个活动。如果你需要在工作流中完成一些复杂的逻辑,可以使用这种方式。这里用一个flowchart为例:

代码

 调用:

  WorkflowInvoker.Invoke( new  FlowChartActivity( " MWK " 2 ));

    注意这个自定义活动实现与前面两个的区别,它在构造函数中指定实现活动的方法,而这个方法返回Activity类型。

4、NativeActivity

    这个活动是四种活动中最强大的一个,实现起来非常的灵活。WF4.0中内置的Sequence 、While 、If、Parallel 等活动都继承此类。如果前面三种都实现不了,这个活动可能能实现你需要的功能。例如自定一个While:

代码

     简单的看下这个MyWhile,很简单分两个部分看:属性和方法。属性有variables、Condition、和Body。方法有构造函数、CacheMetadata、Execute、OnEvaluateConditionCompleted。CacheMetadata、Execute覆盖父类的方法。ScheduleActivity完成之后执行OnEvaluateConditionCompleted。

总结:WF4.0的资料不多,但是相对WF3.0和3.5简单很多,自定义活动是非常重要学习内容。









本文转自麒麟博客园博客,原文链接:http://www.cnblogs.com/zhuqil/archive/2010/02/26/WF-Activity.html,如需转载请自行联系原作者
相关文章
|
7月前
|
存储 编译器 C++
【Qt 元对象系统 02】深入探索Qt的元对象编译器:从原理到实践
【Qt 元对象系统 02】深入探索Qt的元对象编译器:从原理到实践
421 0
|
7月前
|
存储 安全 算法
【C/C++ 泛型编程 进阶篇】C++中的模板参数与成员访问:多种方法详解
【C/C++ 泛型编程 进阶篇】C++中的模板参数与成员访问:多种方法详解
427 0
|
C++ 编译器
读书笔记 effective c++ Item 46 如果想进行类型转换,在模板内部定义非成员函数
1. 问题的引入——将operator*模板化 Item 24中解释了为什么对于所有参数的隐式类型转换,只有非成员函数是合格的,并且使用了一个为Rational 类创建的operator*函数作为实例。
1031 0
|
C++ 编译器 容器
读书笔记 effective c++ Item 45 使用成员函数模板来接受“所有兼容类型”
智能指针的行为像是指针,但是没有提供加的功能。例如,Item 13中解释了如何使用标准auto_ptr和tr1::shared_ptr指针在正确的时间自动删除堆上的资源。STL容器中的迭代器基本上都是智能指针:当然,你不能通过使用“++”来将链表中的指向一个节点的内建指针移到下一个节点上去,但是list::iterator可以这么做。
1124 0
|
C++ 数据安全/隐私保护
读书笔记 effective c++ Item 26 尽量推迟变量的定义
1. 定义变量会引发构造和析构开销 每当你定义一种类型的变量时:当控制流到达变量的定义点时,你引入了调用构造函数的开销,当离开变量的作用域之后,你引入了调用析构函数的开销。对未使用到的变量同样会产生开销,因此对这种定义要尽可能的避免。
828 0