看到题目或许非常多人都会疑问,为什么要使用事件监听呢?
眼下的认识:
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
查看生成的代理类:
当中生成的对应方法为:
public System.Nullable 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:也是启动工作流的还有一种方式
总结:
对于学习来说,我们大家都是从不懂到理解更加深刻,或许到如今我们对工作流的理解还存在偏差,还有好多疑问,可是随着学习的不断深入。理解也在不断深入,记得刚開始看关于工作流中的事件驱动时的不理解。但随着不断的学习,我们自己也在不断解决自己的疑问,相信这就是学习的过程!