《WF编程》系列之18 - 触发事件与调用方法:服务合同 Service Contracts
2007-07-13 10:58
381 查看
3.2.3 触发事件与调用方法
许多开发人员想要建立一个更加正式的机制来方便和工作流交互.尽管使用Dictionary可以简单灵活的向工作流传递数据,但这种方法需要参数名称和伴随属性的严格匹配.而且我们只可以在工作流开始时使用参数向工作流传递数据,或在结束是获取数据.许多工作流需要在执行过程的不同时期和宿主交换数据.我们可以使用事件和方法调用来达到这个目的.这一节,我们来讨论数据传输通信的基本原理.3.2.3.1服务合同 Service Contracts
工作流和其宿主可以通过本地通信服务(LCS,local communication service)交换数据.LCS允许工作流和宿主之间的事件和方法调用.在后台,工作流Runtime和LCS一起工作来截取通信并提供附加服务(就像事件在排队直到工作流处于可以接受事件的状态).通过LCS进行通信需要一个消息合同,在.NET中,合同即接口的意思.接口定义了LCS暴露的事件和方法.事件从宿主传递数据到工作流,而方法从工作流传递数据到宿主.例如,下面的bug跟踪服务接口定义中包含一个事件和一个方法:
[ExternalDataExchange]
interface IBugFlowService
{
void AssignBug(Bug bug);
event EventHandler BugAdded;
}
工作流可以调用AssignBug方法来向宿主传递一个Bug对象.同样,宿主也可以触发BugAdded事件并通过事件的参数向工作流传递数据.ExternalDataExchange属性将接口标识为消息合同.当我们把本地服务添加到Runtime时, Windows Worklow会在metadata中寻找这部分内容.方法中传递的Bug类是一个简单的数据容器,只包括3个属性:
[Serializable]
public class Bug
{
public Bug(int id, string title, string description)
{
_id = id;
_title = title;
_description = description;
}
public Bug()
{
}
private int _id;
public int ID
{
get { return _id; }
set { _id = value; }
}
private string _title;
public string Title
{
get { return _title; }
set { _title = value; }
}
private string _description;
public string Description
{
get { return _description; }
set { _description = value; }
}
}
所有在工作流和宿主之间的传递的对象都必须是可序列化的.我们可以用Serializable属性将Bug类标识为可序列化的类.如果要通过事件传递Bug对象,还需要序列化事件参数类:
[Serializable]
public class BugAddedArgs : ExternalDataEventArgs
{
public BugAddedArgs(Guid instanceId, Bug newBug)
: base(instanceId)
{
_bug = newBug;
}
private Bug _bug;
public Bug NewBug
{
get { return _bug; }
set { _bug = value; }
}
}
除了需要序列化之外,事件参数类必须继承ExternalDataEventArgs类,因为工作流Runtime和LCS在操作事件时会用到此类提供的一些属性.其中一个属性是InstanceId,此属性会被传递到基类的构造函数中.InstanceId是一个全局唯一标识符(GUID, Globally Unique Identiier),Runtime创建的每个工作流实例都会被分配这样一个唯一的实例标识符.利用InstanceId,Runtime可以把事件发送到正确的工作流实例中.
到目前为止,我们已经定义了三个实体:
1. IBugFlowService接口,它允许工作流和宿主进行通信.
2. Bug类,它保存从后方传递到前方的数据.
3. BugAddedArgs类,继承自ExternalDataEventArgs并且在BugAdded事件触发时将数据发送到工作流.
下节我们来讨论服务合同的具体实现方法.
相关文章推荐
- 《WF编程》系列之18 - 触发事件与调用方法:服务合同 Service Contracts 3.2.3 触发事件与调用方法
- 《WF编程》系列之19 - 触发事件与调用方法:服务以及工作流的实现 3.2.3.2服务的实现
- 《WF编程》系列之19 - 触发事件与调用方法:服务以及工作流的实现
- 《WF编程》系列之20 - 触发事件与调用方法:宿主的实现 3.2.3.4 宿主的实现
- 《WF编程》系列之20 - 触发事件与调用方法:宿主的实现
- IOS的AppDelegate方法中的事件触发调用
- IOS的AppDelegate方法中的事件触发调用
- c#中怎样实现当一个类实例的属性值改变时,触发事件调用另一个方法?
- 【JQuery】调用trigger()方法手动触发指定的事件
- IOS的AppDelegate方法中的事件触发调用
- IOS的AppDelegate方法中的事件触发调用
- Struts1.x系列教程(18):使用DispatchAction类调用多个Action方法
- [ios]IOS的AppDelegate方法中的事件触发调用 以及 关闭 ios应用程序
- jQuery实现自动调用和触发某个事件的方法
- Struts1.x系列教程(18):使用DispatchAction类调用多个Action方法
- [原创]如何在关闭当前页面时刷新父页面(调用它的页面),或者触发父页面的某个事件或方法
- c#中实现当一个类实例的属性值改变时,触发事件调用另一个方法
- IOS AppDelegate方法中的事件触发调用
- IOS的AppDelegate方法中的事件触发调用
- MVC设计模式 (1)、html页面事件触发ajax()方法调用ajax.js发送请求至请求目标文件