cdoframework的官方網站:http://www.cdoframework.com
一個業務對象的事務調用接口,目前通行的做法是為每一個事務定義一個特定的方法,如果一個對象實作了多個事務,則會定義出多個方法。下面的例子說明了這一點:
public interface EmployeeManager
{
int addEmployee(Employee emp);
int modifyEmployee(Employee emp);
int deleteEmployee(String employeeId);
}
CDO開發架構認為,事務執行的本質是資料交換。一個事務(或者一個方法)的執行過程,其實是輸入請求資料,輸出應答資料的過程。同時,我們還要知道事務的執行成功與否。此外,事務行為,即方法名,CDO應用開發架構也視其為請求資料的一部分,這樣,任何一個事務,都可以統一為包含請求資料,應答資料和執行結果的執行過程,可定義為:
Return handleTrans(CDO cdoRequest,CDO cdoResponse)
完整的事務對象的接口定義如下:
public interface ITransService
{
Return init();
void destroy();
Return handleTrans(CDO cdoRequest,CDO cdoResponse);
}
在handleTrans方法中,cdoRequest表示請求資料,cdoResponse表示應答資料,Return代表執行結果。
通用事務調用接口的一個顯而易見的好處是,我們無需為不同的業務對象定義不同的接口(不用再編寫接口定義檔案了),事務方法的變更不會影響接口定義。
更為重要的是,由于所有業務對象的事務接口統一了,我們就可以以一種通用的方式實作各事務的業務邏輯。通過可以提供一個服務總線對象,把事務對象轉換成和該服務總線對象相連接配接的一個服務對象。每個服務對象之間的調用不再通過互相引用達成,而是各自僅僅和總線對象相關,各服務對象之間将完全沒有代碼上的耦合,一個服務對象對另一個服務對象的調用,完全是透明地通過服務總線對象進行的。下圖的黃色部分即代表服務總線。
2.利用handleTrans實作通用事務調用接口
像上面的EmployeeManager接口的三個方法,可以統一用handleTrans來代替。其中:
1) cdoRequest為請求對象,儲存事務的請求參數等資訊。請求對象中通過strServiceName和strTransName組合作為Key區分不同的事務,其值為對應的事務名,比如下面的代碼填充了一個請求對象:
cdoRequest.setStringValue(“strServiceName”,” EmployeeService”);
cdoRequest.setStringValue(“strTransName”,”addEmployee”);
cdoRequest.setStringValue(“strName”,”張三”);
cdoRequest.setIntegerValue(“nAge”,20);
//…
2) cdoResponse為應答對象,儲存事務執行的輸出,如果沒有輸出,可以不填充;
3) Return為傳回對象,儲存事務的執行結果
在handleTrans内部,再根據strServiceName和strTransName的值,執行對應的某個具體方法。如果某個事務是handleTrans所不應該處理的,則handleTrans傳回null,以表示未對該事務進行處理。
這種方式在統一了方法定義的同時,還利用CDO對象的優勢,避免了開發諸如Employee這樣的資料類。