• [WF4.0 实战] 事件驱动应用



    看到题目或许非常多人都会疑问,为什么要使用事件监听呢?

     

     

    眼下的认识:

    1,使用事件监听能够将工作流的结点返回值返回到client

    2,能够实现等待与重新启动,相当于之前的WaitActivity创建BookMark的方式

     

    至于使用WorkflowInvokerWorkflowApplication这两种方式临时还没能实现工作流的节点值返回到client。可是对于等待流是能够实现的!

     

    当然要注意的是。假设须要进行事件的监听。则不能使用WorkflowInvoker或者WorkflowApplication来启动流程,而是须要通过WorkflowServiceHost来启动监听(并且这里有个根本差别,WorkflowServiceHost仅仅是启动监听,并不马上创建Workflow的实例)

     

    详细实现:

     

    WF

     

    拖放一个Receive到PickBranch的Trigger里面(我们设置了这个Receive的ServiceContractName。和OperationName。能够随便取名。没有太多限制。这里事实上是使用了WCF的技术。




     


    我们能够选择Receive这个Activity,然后在右键菜单中找到Create SendReply,然后找到合适的位置粘贴就可以。能够生成对应的SendReplyTo,与Receive自己主动关联




    那么,我们究竟要发送什么数据给用户呢?能够点击Activity上面的Content这个地方


         


     WCF

     

    新建一个“控制台应用程序”(Host,加入对应的引用

               

    宿主程序(通过代码的方式启动工作流服务)即将工作流作为一种服务公布出去:


    namespace Host
    {
        class Program
        {
            static void Main(string[] args)
            {
                var host = new WorkflowServiceHost(
                    new DocumentReviewLib.DocumentReviewWorkflow(),
                    new Uri("http://localhost:8080/DRS"));
    
                host.AddDefaultEndpoints();
                host.Description.Behaviors.Add(
                    new ServiceMetadataBehavior() { HttpGetEnabled = true });
    
                host.AddServiceEndpoint(
                    "IMetadataExchange",
                    MetadataExchangeBindings.CreateMexHttpBinding(),
                    "mex");
    
                host.Open();
                Console.WriteLine("Server is ready.");
                Console.Read();
    
            }
        }
    }
    

    点击F5就可以启动服务,在浏览器中能够查看服务

     

        


    那么将这部做完以后我们client是如何调用我们封装的这么一个工作流的服务呢

     

    我们希望client调用这个工作流的服务呢是一个很松的耦合,那么我们能够用一个很easy的办法,去生成呢对这个服务的一个代理,通过这个代理类来进行调用

     

    生成他的代理类

     

    依据上面页面的提示,我们能够产生一个服务代理类。

    注意。要使用Visual Studio Command Prompt。而不是默认的cmd

     

               

         


    查看生成的代理类:




    当中生成的对应方法为:

     

     public System.Nullable<int> CreateTicket()
        {
            CreateTicketRequest inValue = new CreateTicketRequest();
            CreateTicketResponse retVal = ((IDocumentReview)(this)).CreateTicket(inValue);
            return retVal.@int;
        }
    

    WindowsForms:

     

    我们接下来要设计一个Windows Forms的client程序。来使用该服务,发起流程的操作

     

    将刚才工具所生成的两个文件加入到当前项目,而且将output.config改动为app.config

     

    假设client为winform或为wpf那么我们会将这个output改成app.config

    怎样client为webform,我们改名为web.config


          


    client调用


       


    相应的代码:

     public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void btCreate_Click(object sender, EventArgs e)
            {
                var proxy = new DocumentReviewClient();
                var result = proxy.CreateTicket();
    
                lstTickets.Items.Add(result);
            }
        }
    


    执行结果:

             

    附上整个应用程序说明:

            

    以上的演示样例是通过WCF实现的事件驱动方式,使用这样的方式有几种优势:

    1:client调用这个工作流的服务是一个很松的耦合(代理)

    2:能够实现工作流结点往client返回值

    3:也是启动工作流的还有一种方式

     

    总结:

     

    对于学习来说,我们大家都是从不懂到理解更加深刻,或许到如今我们对工作流的理解还存在偏差,还有好多疑问,可是随着学习的不断深入。理解也在不断深入,记得刚開始看关于工作流中的事件驱动时的不理解。但随着不断的学习,我们自己也在不断解决自己的疑问,相信这就是学习的过程!





  • 相关阅读:
    JavaScript 复制变量的三种方法
    WIndows cmd command 指令总结
    Linux 指令总结
    如何在当前目录下打开Windows cmd?
    git使用笔记(四)错误报告 Git push rejected error: fatal: refusing to merge unrelated histories
    CentOS(Linux)
    CentOS(Linux)
    异常描述:hibernate懒加载中,用OpenSessionInViewFilter解决之后,同时对一个collection创建两个session访问导致异常(Illegal attempt to associate a collection with two open sessions)
    【转】hibernate懒加载的问题,failed to lazily initialize a collection of role
    JavaWeb项目里面的路径获取方法总结
  • 原文地址:https://www.cnblogs.com/jhcelue/p/6852997.html
Copyright © 2020-2023  润新知