[WF4.0 实战] 事件驱动应用
看到题目或许非常多人都会疑问,为什么要使用事件监听呢?
眼下的认识:
1,使用事件监听能够将工作流的结点返回值返回到client
2,能够实现等待与重新启动,相当于之前的WaitActivity创建BookMark的方式
至于使用WorkflowInvoker或者WorkflowApplication这两种方式临时还没能实现工作流的节点值返回到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
查看生成的代理类:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVqaW5neXVhbjY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
当中生成的对应方法为:
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调用
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVqaW5neXVhbjY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
相应的代码:
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实战系列索引
转自:http://www.cnblogs.com/zhuqil/archive/2010/07/05/wf4-in-action-index.html 此系列的工作流文件案例比较多点,实用性好. W ...
- [WF4.0 实战] WPF + WCF + WF 打造Hello World(基础篇)
本篇博客是一个基础的演示样例,也就是一个新手教程吧!让大家熟悉一下WPF + WCF + WF三者的关系!这仅仅是一个基础篇,下篇会继续深入,作为这段时间研究工作流的一个小小总结! 三者关系: WPF ...
- [WF4.0 实战] AutoResetEvent具体解释(线程独占訪问资源)
由来: 在学习工作流的过程中,宿主程序中会出现这么一段代码: staticAutoResetEvent instanceUnloaded = new AutoResetEvent(false); 然后 ...
- 基于WF4.0的公文管理系统
系统功能说明 公文管理 通过定义公文的基本信息,并将它按照工作流的定义流转实现公文的管理.包含以下功能: )公文创建:用户能够将格式化文本作为公文上传到系统中,并选择工作流启动流程. )公文审批:具有 ...
- WF4.0 基础篇 (十八) Flowchar
本节主要介绍WF4 中 Flowchart的使用 本文例子下载: http://files.cnblogs.com/foundation/FlowcharSample.rar 本文例子说明 Flowc ...
- 【转】WF4.0 (基础篇)
转自:http://www.cnblogs.com/foundation/category/215023.html 作者:WXWinter —— 兰竹菊梅★春夏秋冬☆ —— wxwinter@16 ...
- WF4.0 基础篇 (一)开始使用WF
来源:https://www.cnblogs.com/caosenianhuan/p/WF.html 最近公司要重新上线一套新的CRM系统,要重整老系统里的业务流模块,团队讨论已微软的workflow ...
- WF4.0(3)----变量与参数
已经写了两篇关于WF4.0的博客,算是基础博客,如果是WF比较熟悉就直接跳过吧,如果你对工作流不是很熟悉,或者想了解一下基础的东西,本文还是比较适合你的.工作流中变量,参数,表达式属于数据模型中概念, ...
- WF4.0(2)----设计工作流
自从做了程序员,发现自己长胖了,而且自己的身体抵抗力也出了问题,最近身体不适,公司工作任务最近也很赶,上次写了WF4.0的简介,这次就工作中工作流设计的几种方式稍微总结一下.设计工作流包括四种方式:流 ...
随机推荐
- Scrapy 应用之爬取《盗墓笔记》
爬取<盗墓笔记>和爬取<宦海沉浮>原理一样,但是使用了两种不同的追踪链接的方式,<盗墓笔记>使用的是跟踪下一页链接,直至没有下一页为止,<宦海沉浮>则是 ...
- 学习笔记5——wp主题开发
我觉得学习wordpress插件开发之前还是得先理解一下wp的主题开发,循序渐进才能学好wordpress开发,话不多说,接下来整理一下这两天学习的wordpress主题开发的一些心得和体会,与大家一 ...
- 【LeetCode】Powerful Integers(强整数)
这道题是LeetCode里的第970道题. 题目描述: 给定两个正整数 x 和 y,如果某一整数等于 x^i + y^j,其中整数 i >= 0 且 j >= 0,那么我们认为该整数是一个 ...
- Dialog共通写法(一个button)
一个button的: package jp.co.hyakujushibank.view import android.app.Dialogimport android.content.Context ...
- BZOJ 4004 [JLOI2015]装备购买 ——线性基
[题目分析] 题目很简单,就是要维护一个实数域上的线性基. 仿照异或空间的线性基的方法,排序之后每次加入一个数即可. 卡精度,开long double 和 1e-6就轻松水过了. [代码] #incl ...
- [luoguP3953] 逛公园(DP + spfa)
传送门 看到求方案数,应该很容易想到dp f[u][i]表示到点u,且比到u的最短距离多i的方案数 那么需要先预处理dis数组,spfa或者堆优化的dijk 因为考虑到dp的顺序,f[u][i]转移到 ...
- BZOJ 3907: 网格【组合数学】
Description 某城市的街道呈网格状,左下角坐标为A(0, 0),右上角坐标为B(n, m),其中n >= m.现在从A(0, 0)点出发,只能沿着街道向正右方或者正上方行走,且不能经过 ...
- BZOJ2246 [SDOI2011]迷宫探险 【记忆化搜索dp + 概率】
题目 输入格式 输出格式 仅包含一个数字,表示在执行最优策略时,人物活着走出迷宫的概率.四舍五入保留3位小数. 输入样例 4 3 3 2 .$. A#B A#C @@@ 143 37 335 85 9 ...
- [USACO08DEC]Trick or Treat on the Farm (拓扑排序,DP)
题目描述 每年万圣节,威斯康星的奶牛们都要打扮一番,出门在农场的N个牛棚里转 悠,来采集糖果.她们每走到一个未曾经过的牛棚,就会采集这个棚里的1颗糖果. 农场不大,所以约翰要想尽法子让奶牛们得到快乐. ...
- 【单调队列+二分查找】bzoj 1012: [JSOI2008]最大数maxnumber
[题意] 维护一个单调递减的q数组,用id数组记录q数组的每个下标对应在原数组的位置,那么id数组一定有单调性(q数组中越靠后,原数组中也靠后),然后二分查找这个数 [AC] #include< ...