任务 3:实现 IOrderingService 接口
在此任务中,通过实现 Simple Order Form 宿主应用程序中的接口,使用在任务 2 中创建的 IOrderingService 接口。
用户提交新订单时,宿主应用程序引发 NewOrder 事件,而此事件由 OrderProcessingWorkflow 处理。 OrderProcessingWorkflow 调用 IOrderingService 的 ItemStatusUpdate 方法。 然后它调用宿主应用程序中用于更新用户接口的方法。
备注
虽然建议您按顺序进行下列练习,但并不要求您这么做。 您可以通过打开示例项目并执行下节中的步骤来开始此练习。
实现接口
按照以下步骤实现上一任务中所创建的接口。
实现 IOrderingService 接口
在 Program 源文件中,从 IOrderingService 接口派生 MainForm 类。
Public Class MainForm : Inherits Form : Implements IOrderingService End Class
public class MainForm : Form, IOrderingService { }
public class MainForm : Form, IOrderingService
在 MainForm 类中创建名为 ItemStatusUpdate 的新公共方法,此方法接受名为 orderId 的 Guid 和名为 newStatus 的 String 作为参数。
Public Sub ItemStatusUpdate(ByVal orderId As Guid, ByVal newStatus As String) Implements IOrderingService.ItemStatusUpdate End Sub
public void ItemStatusUpdate(Guid orderId, string newStatus) { }
在 MainForm 类中创建名为 workflowRuntime 的私有 WorkflowRuntime 字段,并将其初始化为 null(Visual Basic 中初始化为 Nothing)。
在 MainForm 类中创建名为 exchangeService 的 ExternalDataExchangeService 字段,并将其初始化为 null(Visual Basic 中初始化为 Nothing)。
private WorkflowRuntime workflowRuntime = null; private ExternalDataExchangeService exchangeService = null;
在 MainForm 类中创建名为 newOrderEvent 的 NewOrderEventArgs 类型的私有泛型 EventHandler。
在 MainForm 类中创建名为 NewOrder 的 NewOrderEventArgs 类型的公共泛型 EventHandler 事件属性。
在 NewOrder 事件属性中创建 add 和 remove 访问器,以便在 newOrderEvent 事件中添加和移除事件处理程序。
private event EventHandler<NewOrderEventArgs> newOrderEvent; public event EventHandler<NewOrderEventArgs> NewOrder { add { newOrderEvent += value; } remove { newOrderEvent -= value; } }
在 MainForm 构造函数中用于创建 orderHistory 对象的实例的代码之后,创建 WorkflowRuntime 对象的实例。
在上一步中创建的代码之后创建 ExternalDataExchangeService 对象的实例。
通过调用 AddService 方法并将 exchangeService 对象作为参数传递,将 ExternalDataExchangeService 对象添加到 WorkflowRuntime 服务。
通过调用 AddService 方法并将 this(Visual Basic 中为 Me)对象作为参数传递,将 MainForm 对象添加到 ExternalDataExchangeService 服务。
通过调用 StartRuntime 方法启动 WorkflowRuntime。
this.workflowRuntime = new WorkflowRuntime(); this.exchangeService = new ExternalDataExchangeService(); this.workflowRuntime.AddService(this.exchangeService); this.exchangeService.AddService(this); this.workflowRuntime.StartRuntime();
实现新订单处理
接下来,修改 Windows 窗体应用程序,以使用户在单击“提交”按钮时可以提交新订单。 为此,请创建 OrderProcessingWorkflow 的实例并运行该实例,同时传入处理新订单所需的参数。
提交新订单
在 submitButton_Click 方法中创建名为 item 的 System.String 变量,并将其值设置为与 itemsList 控件的 SelectedItem 属性相等。
创建名为 quantity 的 System.Int32 变量,并将其值设置为与 itemQuantity 控件的 Value 属性相等。
string item = this.itemsList.SelectedItem.ToString(); int quantity = (int)this.itemQuantity.Value;
创建名为 orderWorkflow 的 System.Type 变量,并将其值设置为与 OrderProcessingWorkflow 类型相等。
创建名为 workflowInstance 的 WorkflowInstance 变量,并将其值设置为与 workflowRuntime 对象中定义的 CreateWorkflow 方法的返回值相等。 将 orderWorkflow 对象作为参数传递到 CreateWorkflow 方法调用。
Type orderWorkflow = typeof(OrderProcessingWorkflow); WorkflowInstance workflowInstance = this.workflowRuntime.CreateWorkflow(orderWorkflow);
创建 System.String 类型的新泛型 List 对象,并将其分配到 orderHistory Dictionary 集合,同时使用 workflowInstance 对象的 InstanceId 作为密钥。
对于上一步中创建的 orderHistory 密钥位置处的值,通过调用在 Dictionary 类中定义的 Add 方法,添加其值为用户对订单提交的商品名称和数量的 System.String。
this.orderHistory[workflowInstance.InstanceId.ToString()] = new List<string>(); this.orderHistory[workflowInstance.InstanceId.ToString()].Add ("Item: " + item + "; Quantity:" + quantity);
调用在 workflowInstance 对象中定义的 Start 方法。
此时将引发 NewOrder 事件,同时将 null(Visual Basic 中为 Nothing)作为第一个参数传递,并以 workflowInstance 对象的 InstanceId、 item 变量和 quantity 变量初始化新的 NewOrderEventArgs 对象。
workflowInstance.Start(); newOrderEvent(null, new NewOrderEventArgs(workflowInstance.InstanceId, item, quantity));
更新用户接口
最后,使工作流可以使用状态消息更新用户接口。
用状态消息更新用户接口
在 ItemStatusUpdate 方法中验证 ordersIdList 对象的 InvokeRequired 属性是否为 true。
如果此属性为 true,请创建名为 statusUpdate 的新 ItemStatusUpdateDelegate 对象和名为 args 的 System.Object 数组,此数组包含 orderId 和 newStatus 参数。
调用 MainForm 类的 Invoke 方法,并将 statusUpdate 和 args 对象作为参数传递。
If Me.ordersIdList.InvokeRequired = True Then Dim statusUpdate As ItemStatusUpdateDelegate = _ New ItemStatusUpdateDelegate(AddressOf ItemStatusUpdate) Dim args As Object() = New Object(1) {orderId, newStatus} Me.Invoke(statusUpdate, args) Else End If
if (this.ordersIdList.InvokeRequired == true) { ItemStatusUpdateDelegate statusUpdate = new ItemStatusUpdateDelegate(ItemStatusUpdate); object[] args = new object[2] { orderId, newStatus }; this.Invoke(statusUpdate, args); } else { }
备注
以下步骤应该包括在上一步骤中创建的 InvokeRequiredIf 语句的 Else 正文中。
创建 If 语句,以确保 orderHistory 集合包含一个将 orderId 参数用作密钥的值。
在上一步中创建的 If 语句中,将 orderHistory 集合的 orderId 密钥处的值设置为与当前的 DateTime 相等,并在其后附加 newStatus 参数的值。
在步骤 3 中创建的 If 语句中创建嵌套的 If 语句,以验证 ordersIdList 是否在其 Items 集合中包含 orderId。
如果不包含,请将 orderId 的值添加到 Items 集合。
将 orderIdList 的 SelectedItem 属性设置为与 orderId 参数的 System.String 值相等。
将 orderStatus 对象的 Text 属性设置为与 GetOrderHistory 方法的返回值相等。 将 orderId 对象的 System.String 值作为参数传递到 GetOrderHistory 方法。
if (this.orderHistory.ContainsKey(orderId.ToString())) { this.orderHistory[orderId.ToString()].Add (DateTime.Now + " - " + newStatus); // Update order status data UI info if (this.ordersIdList.Items.Contains(orderId.ToString()) == false) { this.ordersIdList.Items.Add(orderId.ToString()); } this.ordersIdList.SelectedItem = orderId.ToString(); this.orderStatus.Text = GetOrderHistory(orderId.ToString()); }
编译代码
有关编译代码的信息,请参见编译代码。
在任务 4:定义 WaitingForOrder 状态中,将通过添加子活动来定义 OrderProcessingWorkflow 中的第一种状态。
请参见
任务
参考
WorkflowRuntime
StartRuntime
ExternalDataExchangeService
AddService
WorkflowInstance
InstanceId
Start
概念
其他资源
教程:创建状态机工作流
Communications
HostCommunication Sample
Ordering State Machine
Simple State Machine
版权所有 (C) 2007 Microsoft Corporation。保留所有权利。