WF4.0 事件驱动应用

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

目前的认识:

1,使用事件监听可以将工作流的结点返回值返回到客户端

2,可以实现等待与重启,相当于之前的WaitActivity创建BookMark的方式

至于使用WorkflowInvoker或者WorkflowApplication这两种方式暂时还没能实现工作流的节点值返回到客户端。但是对于等待流是可以实现的!

当然要注意的是,如果需要进行事件的监听,则不能使用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即可启动服务,在浏览器中可以查看服务

那么将这部做完以后我们客户端是怎样调用我们封装的这么一个工作流的服务呢

我们希望客户端调用这个工作流的服务呢是一个非常松的耦合,那么我们可以用一个非常简单的办法,去生成呢对这个服务的一个代理,通过这个代理类来进行调用

生成他的代理类

根据上面页面的提示,我们可以产生一个服务代理类。注意,要使用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的客户端程序,来使用该服务,发起流程的操作

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

如果客户端为winform或为wpf那么我们会将这个output改成app.config

如何客户端为webform,我们改名为web.config

客户端调用

对应的代码:

 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:客户端调用这个工作流的服务是一个非常松的耦合(代理)

2:可以实现工作流结点往客户端返回值

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

总结:

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

时间: 2024-10-22 16:15:17

WF4.0 事件驱动应用的相关文章

WF4.0 基础篇 (一) 开始使用WF——下篇

创建WF4.0项目 1.打开VS2010 ,[File] -> [New] -> [Project] 2.在出现的[New Project]对话框的[Installed Templates]树上选[Workflow],在出现的模板列表框中选[Workflow Console Application]项 在[Name]框中输入[helloWorkflow],点击[OK]进入WF4.0项目的设计界面 创建一个"hello wxwinter"屏幕的输出的工作流 按[F5]运行程,

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

看到题目或许非常多人都会疑问,为什么要使用事件监听呢? 眼下的认识: 1,使用事件监听能够将工作流的结点返回值返回到client 2,能够实现等待与重新启动,相当于之前的WaitActivity创建BookMark的方式 至于使用WorkflowInvoker或者WorkflowApplication这两种方式临时还没能实现工作流的节点值返回到client.可是对于等待流是能够实现的! 当然要注意的是.假设须要进行事件的监听.则不能使用WorkflowInvoker或者WorkflowAppli

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

给大家分享一下,如何完全使用代码自定义的创建生成工作流文件(用代码创建Xaml文件),并且动态加载运行所生成的工作流. 工作流生成后 在Xaml文件里的主要节点如下: 输入输出参数 <x:Members> <x:Property Name="Item" Type="InArgument(qm:RuleModel)" /> <x:Property Name="Result" Type="OutArgument

[WF4.0 实战] AutoResetEvent具体解释(线程独占訪问资源)

由来: 在学习工作流的过程中,宿主程序中会出现这么一段代码: staticAutoResetEvent instanceUnloaded = new AutoResetEvent(false); 然后就是在方法中这样使用: instanceUnloaded.Set();//将事件状态设置为终止状态.同意一个或多个等待线程继续 instanceUnloaded.WaitOne();//对于WaitOne方法为阻止当前线程,直到收到信号! 对于这部分内容当时不是非常理解,以下我们先介绍一下AutoR

WF4.0 基础篇 (一)开始使用WF——上篇

最近公司要重新上线一套新的CRM系统,要重整老系统里的业务流模块,团队讨论已微软的workflow作为技术基础.本人之前没有涉及过相关的知识,目前项目还没开始,前期来系统的的学习和了解下WF为后期开发打下些技术基础.该篇为开题片,做一些简单那的介绍和入门. 从WinFX到NET3.x再到NET4.0 ,WPF,WCF,WF 始终是放在一起的,WPF(silverlight)用于程序UI的展现,WCF用于程序通信,WF用于程序的逻辑控制,这种思想在微软提出WinFX到现在的NET3.x再到NET4

WF4.0——升级技能:委托应用

回顾: 在一个月前,我们刚刚回顾了面对象至关重要的部分:委托,具体请移步我们博客:面向对象--一起来复习委托与事件!关于这篇博客的具体内容,不再赘述,在这里我们主要讨论在工作流中的应用及他的具体如何解耦我们的业务,界面! 对比: 普通实现: 工作流的理想实现: 认真观察我们发现,状态信息有工作流自带的持久层维护,我们要做的和下文章的自然就变成了调用逻辑,在这一层,怎么解耦,就提上了日程,结果我们发现,解决这个问题,非委托不能胜任!具体的情况呢,请大家先看代码: 代码示例: <span style

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

前提: 在项目的开发中,我们知道,加入泛型,通过对类型的封装,进行抽象后,可以大大减少我们代码量,在项目中,泛型可以说是高级工程师必备的技能之一,也是面向对象的核心"抽象"的技术基础之一,他这么牛,在工作流的开发中,我们不免就要考虑! 还有一个技术,也是一个重要的内容,就是委托,在项目中,我们通过委托可以对层级之间,对象之间的关系就行解耦,将耦合延迟到运行状态时进行绑定,这样我们就能在改动较为少的前提下对项目的变动作出快速的反应!而在工作流的开发过程中,我们也是要加入的必备技术!(请关

WF4.0实战系列(转载)

http://www.cnblogs.com/zhuqil/archive/2010/07/05/wf4-in-action-index.html

WF4.0入门(一)

WF的全称是Windows Workflow Foundation .这是 Microsoft 快速构建基于工作流的应用程序的编程模型.引擎和工具.NET Framework 4 中这个 WF 版本更改了上一个版本中的几种开发范式:现在可以更加轻松地创建.执行.维护和实现众多新功能. 我将通过不断组demo的形式来慢慢讲解WF的用法即原理. 初期的demo一共分为10个,分别是: Hello Workflow Refactoring Workflow The CodeActivity Dynam