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 學習的初步階段,有可能本人對一些理解的概念存在偏頗甚至錯誤;此文僅做學習探討之用,不負其他責任 。