天天看點

asp.net中的報帳多級審批工作流中調用WCF

      這一篇我把WF中有關資料處理的操作完全交給WCF處理,WF隻關心流程的設計處理,至于底層資料如何操作并不需要關心。這在很大程式上減少了應用程式之間的耦合度。

      SendActivity:用戶端活動,用于模拟 WCF 服務操作的同步調用。

      在WF中可以利用SendActivity完成對WCF的調用,不需要用傳統的方式,先生成一個WCF代碼,然後調用相應的方法。在項目中我們觸發外部事件是靠"HandleExternalEvent activity",在事件中寫相關的業務邏輯代碼,覺的耦合度高了點,因為WF不光要設計工作流,而且需要和資料庫打交道。

     解決方案:在HandleExternalEvent activity後面加上一個SendActivity,此時HandleExternalEvent的事件的唯一作用就是給SendActivity參數指派。由于項目中的狀态比較多,我展示員工狀态的活動圖:

asp.net中的報帳多級審批工作流中調用WCF

        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);

            }

        }

              第二:設定參數,如下圖:

asp.net中的報帳多級審批工作流中調用WCF

         最後的 SendActivity屬性設定界面如下:

asp.net中的報帳多級審批工作流中調用WCF

        WF代碼的變化:員工的事件代碼如下,會發現已經沒有任何有關業務邏輯的代碼,僅僅是給一個屬性指派。所有的通信操作都交給SendActivity去完成。

       private   void  OnStaffSubmit_Invoked( object  sender, ExternalDataEventArgs e)

        {

            info  =  e  as  ExpenseAccountInfo;

            sendActivity1Value  =  info;                     

        }      

        啟用WCF後的網站結構的變化:網站的UI(網頁層)在處理審批流程時,隻和WF溝通,WF隻負責流程處理,并不關心資料處理過程,WCF完成WF發來的請求。 改造前的WF即要設計審批流程,要又負責資料處理。

asp.net中的報帳多級審批工作流中調用WCF

      最後說一個下調試:在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