看到题目也许很多人都会疑问,为什么要使用事件监听呢?
目前的认识:
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:也是启动工作流的另一种方式
总结:
对于学习来说,我们大家都是从不懂到理解更加深刻,也许到现在我们对工作流的理解还存在偏差,还有好多疑问,但是随着学习的不断深入,理解也在不断深入,记得刚开始看关于工作流中的事件驱动时的不理解,但随着不断的学习,我们自己也在不断解决自己的疑问,相信这就是学习的过程!