• 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



    工作流设计




    引警




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

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


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

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

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

  • 相关阅读:
    java中排序算法
    maven常用命令
    Team_GJX模板整理
    BZOJ 4128
    BZOJ 1169: [Baltic2008]Grid
    Codeforces Round #448 (Div. 2)
    HDU 5942
    2016 ICPC 沈阳
    2016 ICPC 北京
    2016 CCPC 杭州
  • 原文地址:https://www.cnblogs.com/foundation/p/913068.html
Copyright © 2020-2023  润新知