1、 从宿主程序启动 Workflow 实例(不带参数):
Type type = typeof(WorkflowClass);
WorkflowInstance workflow = wfRuntime.CreateWorkflow(type).Start();
2、 从宿主程序启动 Workflow 实例(带有参数):
Dictionary <string, object> parms = newDictionary<string, object>();
parms.Add("Para1Name", Para1Value); //Para1Name 对应于WorkflowClass同类型的属性
parms.Add("Para2Name", Para2Value); //Para2Name 对应于WorkflowClass同类型的属性
Type type = typeof(WorkflowClass);
WorkflowInstance workflow = wfRuntime.CreateWorkflow(type, parms).Start();
3、 Workflow 调用外部方法(多为宿主程序的方法):
A、 定义一个注明 [ExternalDataExchange] 的接口,申明调用的方法( Local Service 实现)
[ExternalDataExchange]
public interface IApproveService
{
string GetApprover(LVInfo obj);
}
B、 定义一个实现了 A 之接口的类(即 Local Service )
public class ApproveService : IApproveService
{
public string GetApprover(LVInfo obj)
{
// 具体业务逻辑的实现
}
}
C、 Workflow 中的调用实现 ==> 具体的参数决定了对应的属性
a .在 WorkflowClass 中定义属性“ string Approver , LVInfo ObjLVInfo ”
b .使用 CallExternalMethodAcitivity ,其属性中 InterfaceType 为 IApproveService , MethodName 为 GetApprover ,其对应的 Parameter ReturnValue 为 Approver , Parameter 为 ObjLVInfo 。
4、 Workflow 响应外部事件(可单独响应,亦可用 Listen 侦听) ==> 与 3 可并于一起实现:
A、 定义一个继承 System.Workflow.Activities. ExternalDataEventArgs 类的事件参数类
public class ApproveEventArgs : ExternalDataEventArgs
{
public ApproveEventArgs(Guid instanceId, …… ) : base(instanceId)
{
// 构造函数业务逻辑
}
// 其他业务逻辑的属性
}
B、 定义一个注明 [ExternalDataExchange] 的接口,申明响应的 event ( Local Service 实现)
[ExternalDataExchange]
public interface IApproveService// 具体种类根据业务逻辑需要而定
{
event EventHandler<ApproveEventArgs> Approved;
event EventHandler<ApproveEventArgs> Rejected;
}
C、 定义一个实现了 B 之接口的类,并实现各个具体的事件响应(即 Local Service )
public void Approve() // Called by the host to approve an order
{
ThreadPool.QueueUserWorkItem(CallBackForApproval); // 此处是为了线程的优化
}
private void CallBackForApproval(object o)
{
EventHandler<ApproveEventArgs> orderApproved = this.Approved;
if (orderApproved != null)
orderApproved(null, newApproveEventArgs(instanceId.InstanceId, ……));
}
public void Reject() // Called by the host to reject an order
{
ThreadPool.QueueUserWorkItem(CallBackForRejection); // 此处是为了线程的优化
}
private void CallBackForRejection(object o)
{
EventHandler<ApproveEventArgs> orderRejected = this.Rejected;
if (orderRejected != null)
orderRejected(null, newApproveEventArgs(instanceId.InstanceId, ……));
}
// Events that handled within a workflow by HandleExternalEventActivity activities
public event EventHandler<ApproveEventArgs> Approved;
public event EventHandler<ApproveEventArgs> Rejected;
D、 Workflow 中的调用实现
使用 HandleExternalEventAcitivity ,其属性中 InterfaceType 为 IApproveService , EventName 为其对应的事件名称(如 Approved 或 Rejected )。
5、 关于 Listen 的使用说明:
A、 MS 对 Listen 的说明:
Makes the workflow wait for any one of several possible events before the activity proceeds.
B、 Wait For :
Listen 对于事件的处理,仅仅起到 wait 的作用。其要求 Local Service 暴露所有的事件处理方法,如 Approve() 、 Reject ;并且要求外界调用者知道每个方法具体对应的事件。
C、 侦听:
Listen 对于事件的侦听,其实就是通过 Local Service 对象的方法触发。但 Listen 只能侦听 WorkflowRuntime 的 Services 集合元素(类型为 ExternalDataExchangeService )中 Service 实例触发的事件。对于非其中 Local Service 实例,则不能触发 Listen 子 Acitivity HandleExternalEventAcitivity 的 Invoked 中指定的方法,即 Local Service 实例的 event 委托为 null 。
D、 添加侦听服务的代码实现:
static OrderServiceImpl orderService;
static void
{
orderService = newOrderServiceImpl();
WorkflowRuntime workflowRuntime = newWorkflowRuntime();
ExternalDataExchangeService dataService = newExternalDataExchangeService();
workflowRuntime.AddService(dataService);
dataService.AddService(orderService);
// 针对C的说明,只有此orderService实例调用Approve或Reject方法,才能触发相应事件;而如果其他的实例,则只能调用Approve或Reject方法,但其event委托为null
}
6、 声明: WFF 学习的初步阶段,有可能本人对一些理解的概念存在偏颇甚至错误;此文仅做学习探讨之用,不负其他责任 。
浙公网安备 33010602011771号