這一篇我把WF中有關資料處理的操作完全交給WCF處理,WF隻關心流程的設計處理,至于底層資料如何操作并不需要關心。這在很大程式上減少了應用程式之間的耦合度。
SendActivity:用戶端活動,用于模拟 WCF 服務操作的同步調用。
在WF中可以利用SendActivity完成對WCF的調用,不需要用傳統的方式,先生成一個WCF代碼,然後調用相應的方法。在項目中我們觸發外部事件是靠"HandleExternalEvent activity",在事件中寫相關的業務邏輯代碼,覺的耦合度高了點,因為WF不光要設計工作流,而且需要和資料庫打交道。
解決方案:在HandleExternalEvent activity後面加上一個SendActivity,此時HandleExternalEvent的事件的唯一作用就是給SendActivity參數指派。由于項目中的狀态比較多,我展示員工狀态的活動圖:
SendActivity屬性設定:
1:ChannelToken:SendActivity 在建立其自身與用戶端通道之間的關聯時所使用的 ChannelToken。
2:Name:擷取或設定此執行個體的名稱。此名稱必須符合工作流項目中使用的程式設計語言的變量命名規則。
3:EndpointName : 用于與服務通信的Endpoint 。
4:ServiceOperationInfo:WCF服務接口。
5:OwnerActivityName :關聯的 Activity 的名稱 。
6:Parameters:方法中的參數。這個參數需要背景代碼支援,這裡分為兩步:
第一:建立一個新的成員:
public static DependencyProperty sendActivityValueProperty =
DependencyProperty.Register("sendActivityValue",
typeof(ExpenseAccountInfo),
typeof(ApproveWorkFlow.MyWorkFlowStateMachine.Workflow1));
[DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Visible)]
[BrowsableAttribute( true )]
[CategoryAttribute( " 參數 " )]
public ExpenseAccountInfo sendActivity1Value
{
get
{
return ((ExpenseAccountInfo)( base .GetValue(Workflow1.sendActivityValueProperty)));
}
set
{
base .SetValue(Workflow1.sendActivityValueProperty, value);
}
}
第二:設定參數,如下圖:
最後的 SendActivity屬性設定界面如下:
WF代碼的變化:員工的事件代碼如下,會發現已經沒有任何有關業務邏輯的代碼,僅僅是給一個屬性指派。所有的通信操作都交給SendActivity去完成。
private void OnStaffSubmit_Invoked( object sender, ExternalDataEventArgs e)
{
info = e as ExpenseAccountInfo;
sendActivity1Value = info;
}
啟用WCF後的網站結構的變化:網站的UI(網頁層)在處理審批流程時,隻和WF溝通,WF隻負責流程處理,并不關心資料處理過程,WCF完成WF發來的請求。 改造前的WF即要設計審批流程,要又負責資料處理。
最後說一個下調試:在WF中應用WCF,最關鍵的一步就是添加一個WCF的引用,如果這個WCF是在IIS中,也就是說位址是固定的,添加完引用後,如果我們是直接按F5運作解決方案,此時會應用程式會動态配置設定一個端口,這樣在生成代理類後,endpoint并不是配置檔案中的,我的解決方案就是直接添加項目中的WCF,然後将WCF與WEB程式同時啟動,即多項目啟動,這樣就可以調試到服務端了。或者是網站程式也放到IIS中,從IIS中打開網站,這樣就避免了動态應用程式端口帶來的問題。
注:
本文引用:http://www.cnblogs.com/foundation/archive/2008/05/23/1205430.html
轉載于:https://www.cnblogs.com/ASPNET2008/archive/2009/03/03/1402042.html