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

Posted jhcelue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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 [email protected];
    }

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:也是启动工作流的还有一种方式

 

总结:

 

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











































以上是关于[WF4.0 实战] 事件驱动应用的主要内容,如果未能解决你的问题,请参考以下文章

WF4.0——升级技能:泛型应用

WF4.0以上使用代码完整自定义动态生成执行工作流Xaml文件

Netty实战一之异步和事件驱动

Android 事件分发事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup )(代码片段

SpringCloudStream实战

如何运用领域驱动设计 - 值对象