当前位置: 首页 > news >正文

《WF编程》系列之28 - 本地通信事件:CallExternalMethodActivity

4.2 本地通信事件

让工作流和外部世界进行交互也并不是什么难事,因为WF本身就内置了一些活动来完成这样的工作.

这一节我们来讨论一下可以和宿主进程提供的本地服务进行通信的活动们

为了能让本地通信可以工作,我们需要以.NET接口的形式定义一个合同.在这个接口中会包含一些方法和事件,工作流可以通过这些方法来调用本地服务,而本地服务则可以触发这些会被工作流处理的事件.

还是关于bug跟踪的例子.有时候我们需要更详细的描述一个bug,比如一张截图.工作流可以向宿主索取这种额外需要的文档.也许宿主会自动上传文档,但实际上更多的情形是,宿主会提醒一个用户:”Hi,您需要提供bug的更详细信息!”.接着,工作流会等待图片被上传(或许几秒钟,或许几天).图片上传完毕后,宿主可以通过一个事件来通知工作流.下面的接口定义了一个服务合同. ExternalDataExchange特性将接口标识为本地通信服务,而且凭借这个标识,Runtime还会将这个接口识别为服务合同.

[ExternalDataExchange]

interface  IBugService

{

bool  RequestUpload(Guid id,  string  userName);

event  EventHandler UploadCompleted;

}

接下来介绍可以和这个接口交互的两个活动: CallExternalMethod和HandleExternalEvent.

4.2.1 CallExternalMethodActivity

CallExternalMethod活动可以调用本地服务上的方法.我们需要做的仅仅是设置这个活动的属性:



首先应该设置的是InterfaceType属性,设计器会通过我们设置的接口来自动发现服务中所有可用的方法.一旦我们把InterfaceType设置为之前定义的接口,我们就可以为MethodName属性选择需要调用的方法.设计器还会在属性面板中列出该方法需要的参数.我们可以将这些输入参数和方法的返回值绑定到工作流的域或属性.譬如图中的_newBug就是工作流的一个域.

为了使CallExternalMethod活动工作,我们需要在工作流Runtime中添加一个ExternalDataExchangeService,然后再向ExternalDataExchangeService中添加一个本地服务BugFlowService(BugFlowService类实现了IBugService接口).

WorkflowRuntime workflowRuntime  =   new  WorkflowRuntime();

ExternalDataExchangeService dataService 
=   new  ExternalDataExchangeService();

workflowRuntime.AddService(dataService);

BugFlowService bugService 
=   new  BugFlowService();

dataService.AddService(bugService);

CallExternalMethod活动包含一个MethodInvoking事件,这个事件会在活动调用外部方法之前触发,我们可以利用这个事件来动态的操作这些参数:

private   void  callExternalMethodActivity1_MethodInvoking( object  sender, EventArgs e)

{

if  ( string .IsNullOrEmpty(_newBug.NewBug.Description))

{

_newBug.NewBug.Description 
=   "  这家伙太懒了,什么都没留下. " ;

}

}
 
相关随笔:
《WF编程》系列之18 - 触发事件与调用方法:服务合同 Service Contracts
《WF编程》系列之19 - 触发事件与调用方法:服务以及工作流的实现


 

相关文章:

  • NetTiers学习笔记10---Services Rethrow Exception
  • GPRS技术在配电监控系统中的应用[转载]
  • 如何取得Access数据库中的所有用户表和视图
  • string 与stringbuilder的区别
  • LINQ 的演变及其对 C# 设计的影响
  • 读:『博客家园』 [博客人生]结婚是因为无路可逃
  • WINDOWS SERVER 2003从入门到精通之使用IIS服务配置WEB站点
  • 简单状态机Workflow基于Web应用【转】
  • 局域网客户端的管理
  • 风儿带着我们飘
  • 利用C#制作一个仿IE地址栏的文本框
  • Oracle高级复制机制
  • 控制允许将新计算机加入域的权限
  • 简易ERP是什么?(帮你理解ERP)
  • 设计模式(22)-Strategy Pattern
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 10个确保微服务与容器安全的最佳实践
  • 2019年如何成为全栈工程师?
  • JavaScript的使用你知道几种?(上)
  • JavaScript设计模式系列一:工厂模式
  • java小心机(3)| 浅析finalize()
  • React中的“虫洞”——Context
  • Swift 中的尾递归和蹦床
  • vue-router 实现分析
  • 创建一种深思熟虑的文化
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 基于axios的vue插件,让http请求更简单
  • 精彩代码 vue.js
  • 力扣(LeetCode)21
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 时间复杂度与空间复杂度分析
  • 算法-插入排序
  • 网页视频流m3u8/ts视频下载
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 小而合理的前端理论:rscss和rsjs
  • 学习HTTP相关知识笔记
  • 用 Swift 编写面向协议的视图
  • 自制字幕遮挡器
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • #Linux(权限管理)
  • #WEB前端(HTML属性)
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (06)Hive——正则表达式
  • (4)(4.6) Triducer
  • (4.10~4.16)
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (四)Linux Shell编程——输入输出重定向
  • (四)linux文件内容查看
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容