WCF從理論到實踐(13):事務投票

作者: jillzhang  來源: 博客園  發布時間: 2008-11-28 15:59  閱讀: 1913 次  推薦: 0   原文鏈接   [收藏]  

系列文章導航:

WCF從理論到實踐(1):揭開神秘面紗

WCF從理論到實踐(2):決戰紫禁之巔

WCF從理論到實踐(3):八號當鋪之黑色契約

WCF從理論到實踐(4):路在何方

WCF從理論到實踐(5):Binding細解

WCF從理論到實踐(6):WCF架構

WCF從理論到實踐(7):消息交換模式

WCF從理論到實踐(8):事件廣播

WCF從理論到實踐(9):實例模式和對象生命周期

WCF從理論到實踐(10):異常處理

WCF從理論到實踐(11)-異步

WCF從理論到實踐(12):事務

WCF從理論到實踐(13):事務投票

WCF從理論到實踐(14):WCF解決方案模板

WCF從理論到實踐(15):響應變化

WCF從理論到實踐(16):操作重載(帶視頻+ppt+源碼)

WCF從理論到實踐(17):OO大背離(帶視頻+ppt+源碼)

 

通過上文WCF從理論到實踐:事務的學習,我們了解了WCF中實現事務的一些基本常識,但WCF中的事務并不止那么簡單,上文中我們欠缺了一個最重要的功能:事務投票,所謂事務投票就是一種靈活控制事務提交的方式,在上文中我們設置服務方法的TransactionAutoComplete為true,其實意味著方法在沒有異常的情況下自動投贊成票,但有時我們希望當操作中只有某個數據滿足具體條件的時候,才能贊同事務提交,這樣上文的實現明顯就不滿足需求了,此時我們可以用OperationContext.Current.SetTransactionComplete();顯示的進行投票。注意,WCF的事務必須在全票通過的時候才能得以提交。本文還是結合銀行的例子 來演示一下事務投票,并且搭配一個漂亮的WPF客戶端,可謂買一送一了,:)。

本文目的

  1. 進一步學習WCF事務
  2. 順便體驗一下WPF

本文適合讀者

本文適合WCF中級用戶,至少需要了解事務的基本常識和簡單實現,初學者可以先閱讀WCF從理論到實踐:事務

進一步學習WCF事務

本文中,我們要模擬的現實情境如下,搭建一個聯盟銀行服務自助系統,這個系統提供在各個銀行之間進行自由轉帳的功能,按照慣例,系統分為四個層次,分別如下:

層次

項目

服務契約

Jillzhang.Wcf.Transactions.Contracts

服務端

Jillzhang.Wcf.Transactions

宿主程序

Jillzhang.Wcf.Transactions.ICBC-用于模擬工商銀行

Jillzhang.Wcf.Transactions.CCB-用于模擬建設銀行

客戶端

Jillzhang.Wcf.BankClient – 包括一個漂亮的WPF窗體

服務契約

我們在此處定義一個IBank的服務契約,它包括四個操作契約,分別為:

 

操作契約

契約說明

[OperationContract(IsTerminating=false)]
[TransactionFlow(TransactionFlowOption.Allowed)]
 decimal Receive(decimal money);

接受其他銀行的匯款,增加本行帳戶余額

[OperationContract(IsTerminating = false)] [TransactionFlow(TransactionFlowOption.Allowed)]

decimal Send(decimal money);

給其他銀行帳戶匯款,減少本行帳戶余額

[OperationContract(IsTerminating = false)]

decimal GetBalance();

獲取帳戶余額

[OperationContract(IsTerminating=false)]

decimal SendOnServer(decimal money,string toBank);

通過一個銀行接口,完成匯款操作,其中事務是在服務端進行

服務端

服務端,由于我本地沒有數據庫,偷下懶,就用一個靜態變量表示帳戶余額了。大家在驗證事務的效果的時候,應該將這里的數據存儲到數據庫中。整個服務端的代碼為:

 

服務端

注意,本文的Receive和Send方法的TransactionAutoComplete設置的為false,這樣就需要我們在事務包含的每個方法中均顯示的進行事務投票,即調用OperationContext.Current.SetTransactionComplete();如果忽略此處,系統會出現如下的異常:

而且如果TransactionAutoComplete為false的時候,必須將InstanceContextMode設置為PerSession,并且服務契約(ServiceContract)也必須設置SessionMode為Required,否則分別 會出現如下異常:

而如果TransactionAutoComplete為True,則要求TransactionScopeRequired必須同時為True,否則會出現異常:

宿主程序

宿主程序非常簡單,我們只是將服務寄宿到兩個不同的進程中并且指定不同的服務地址便可,唯一值得注意的是因為服務契約需要事務支持,所以Binding的TransactionFlow也必須為True.

他們的代碼分別為:

Jillzhang.Wcf.Transactions.ICBC

 

ICBC


Jillzhang.Wcf.Transactions.CCB

 

CCB


客戶端

一個WPF應用程序,可以調用服務來模擬銀行轉帳功能,因為本文著重介紹WCF,對此不作詳細贅述,以后在一起學WPF系列中會逐步加以學習,本文只給出主要的xaml文件和.cs文件

Window1.xaml

 

Windows.xaml


Window1.xaml.cs

 

Windows.xaml.cs

有兩種方式可以實現轉帳,上面代碼中是在客戶端實現事務,另外一種你可以將using (TransactionScope tx = new TransactionScope())塊注釋起來,然后將下面的注釋取消,這樣就可以在服務端實現事務。

下面就讓我們來看下運行效果吧:

ICBC-工商行服務

CCB-建設行服務

我們漂亮的客戶端效果為:

其實中國工商銀行和中國建設銀行的賬戶余額均為10,如上圖所示,選擇中國工商銀行,然后輸入轉帳金額4,點擊轉帳,運行后效果如下:

選擇中國建設銀行,可以看到余額為14,如圖:

 范例項目下載

 /Files/jillzhang/Jillzhang.Wcf.Transactions.rar

總結

WCF為我們提供了一種顯示控制事務提交的方式,即事務投票,我們通過OperationContext.Current.SetTransactionComplete();來投贊成票,而只有參與事務的全部方法均投贊成票的時候,事務才能被成功提交。顯示的投票方法比聲明TransactionAutoComplet為true更靈活。同時我們又體驗了一把WPF的魅力。

0
0
 
 
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()