WF 表决的例子

先看一下基本流程的草图

说一下用WF的实现思路
1.设计[表决人发表意见]的Activity,这是一个通知,回复的过程,所以用一个组CallExternalMethod与HandleExternalEvent实现通知与等待回复
2.由于参与人数是不特定的,但所有参与人的参与流程是一样的,所在使用一个ReplicatorActivity容器创建[表决人发表意见]的Activity多个复本
3.表决是并发的,所以ReplicatorActivity容器应设为并发
4.由于存在多个[表决人发表意见]的Activity的HandleExternalEvent同时等待,这样新需要使用CorrelationToken关联CallExternalMethod与HandleExternalEvent
5.由于参与人数不确定,ReplicatorActivit的InitialChildData集合需要在启动流程时由用户定义户后传入

 

数据项类
    public class DataItem
    
{
        
public DataItem(string partakeName)
        
{
            
this.PartakeName = partakeName;
        }

        
public string PartakeName;
        
public string Result;
    }


allExternalMethod与HandleExternalEvent绑定类
使用
System.Workflow.Activities.CorrelationParameter
System.Workflow.Activities.CorrelationInitializer
System.Workflow.Activities.CorrelationAlias
为CallExternalMethod与HandleExternalEvent实现关联

//接口
    [System.Workflow.Activities.ExternalDataExchange]
    [System.Workflow.Activities.CorrelationParameter(
"PartakeName")]
    
public interface IExternalEvent
    
{
        [System.Workflow.Activities.CorrelationInitializer]
        
void CreateBallot(string PartakeName, object value);
        
        
//关联参数
        
//对应到事件的属性
        [System.Workflow.Activities.CorrelationAlias("PartakeName""e.PartakeName")]
        
event EventHandler<EventArgs> WxdEvent;
    }

   
    
//事件参数
    [Serializable]
    
public class EventArgs : System.Workflow.Activities.ExternalDataEventArgs
    
{
        
public string Result;
        
private string _PartakeName;
        
public string PartakeName
        
{
            
get return _PartakeName; }
            
set { _PartakeName = value; }
        }


        
public EventArgs(Guid instanceId, string PartakeName)
            : 
base(instanceId)
        
{
            _PartakeName 
= PartakeName;
        }

    }


    
//接口实现类
    public class WxdExternalEvent : IExternalEvent
    
{
        
//实现接口事件
        public event EventHandler<EventArgs> WxdEvent;
        
//实现接口方法
        public void CreateBallot(string PartakeName, object value)
        
{
            System.Console.WriteLine(
"通知{0}参与表决" , PartakeName);
        }


        
//触发事件
        public void OnWxdEvent(Guid instanceId, string PartakeName, string Result)
        
{
            EventArgs e 
= new EventArgs(instanceId, PartakeName);
            e.Result 
= Result;
            WxdEvent(
null, e);
        }

    }


自定义投票Activity



工作流设计




引警




代码下载  
    http://files.cnblogs.com/foundation/WorkflowLibrary3.rar

补充一下
以上例子是为了演示ReplicatorActivity的使用,以及使用CorrelationToken关联CallExternalMethod与HandleExternalEvent。
在实际应用中[表决人发表意见]的Activity可以做如下设计


如果参与人没有在指定的事间内进行表决,系统将按超时处理,这样可以避免某个用户不表决,使整个流程一直处于挂起状态。在实例应用中,delay通常不直接用作业务结点,而是独立的实现一个时间引擎,这样处理工作日、节假日、申请延期处理等方面比效灵活

还有,如果可以不需要所有的参与人都完成表决流程才继续向下运行,可以加入规则判断,当同意或不同意的达到一定票数后新直接显示结果,当然这要看实际的业务是否有这种要求

添加上述功能比效简单,这里就不提供代码了
测试通过后,将引擎与客户端分别封装,
引擎可以选择Win服务,COM+,IIS的Application作为宿主
客户端可以选择WinForm、WEB
当然还要选择一种通信方式,WebService、Remoting、WCF、TCP都可以
以上的各种组合的例子都写过,这里也就不再提供了

posted @ 2007-10-02 18:21 WXWinter(冬) 阅读(2423) 评论(8)  编辑 收藏 网摘
Body:62.5,BeforeCate:0,15.625

  回复  引用  查看    
#1楼2007-10-03 12:50 | 无处坏      
楼主真好,国庆还为我们这些初学者准备学习的资料,太感谢您了.
在这里问楼主一个问题.如果是winform的模式,采用WebService、Remoting、WCF、TCP其中一种通信方式,是不是可以做到客户端不用装wf的框架也可运行wf的程序呢.也就是说我只在服务器装就可以了.因为有些客户端现在还是win2000系统,装不了wf的框架及.net3.0,谢谢楼主

  回复  引用  查看    
#2楼[楼主]2007-10-03 14:37 | WXWinter(冬)      
@无处坏
(^_^)

这种方式,客户端不需要WF

VC或VB开发Winform 使用tcp,客户端什么也不用装
VC或VB开发Winform 使用WebService,可以使用SoapTool开发包,客户端也要安装SoapTool
Remoting最好在NET平台下开发,客户端要装NET类库
WCF最好在NET平台下开发,客户端要装NET3.0类库,这个类库包括WF

也就是说除了使用VC+TCP开发客户端,在Windows2000客户端上基本都要在安装一个包,因此还不如安装NET3.0

  回复  引用  查看    
#3楼2007-10-03 18:36 | 无处坏      
谢谢LZ的指点.装.net2.0的没什么关系.我主要的是关注wf在win2000系统安装不了.我要如何做才能实现跟客户端的windows操作系统无关.我只要在服务器端安装.net3.0 跟wf框架就可以了.
再问LZ一个问题
@无处坏
(^_^)

这种方式,客户端不需要WF ,那应该装.net2.0就可以吧,不用装.net 3.0的吧,谢谢

  回复  引用    
#4楼2007-10-04 04:32 | w[未注册用户]
学习了。
  回复  引用  查看    
#5楼2007-10-04 12:27 | 无处坏      
对于LZ提到的"VC或VB开发Winform 使用WebService,可以使用SoapTool开发包,客户端也要安装SoapTool "我想问一下LZ,如果我的客户端也是.net写的话,应该就不用装SoapTool吧,谢谢 
  回复  引用    
#6楼2007-10-06 14:09 | w[未注册用户]
不错!!!!!!!!!
  回复  引用  查看    
#7楼[楼主]2007-10-11 13:29 | WXWinter(冬)      
@无处坏
不用了

  回复  引用  查看    
#8楼[楼主]2007-10-11 13:30 | WXWinter(冬)      
@w
(^_^)

  回复  引用    
#9楼2007-10-26 10:47 | 半山旅客
托着下巴学习中。。。



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 913068 FPZcJNt40Lo=



相关文章:

相关链接: