原子操作和規範約定
此次設計的思路是:在用戶端只需要發少量的資料,即操作集合,每個操作的參數給總站伺服器,總站伺服器很快的解析伺服器發來的請求,按照一定的規範去執行每一個操作,當每個操作都執行成功後再把其返回給用戶端。
執行事務時傳遞的過程
此次設計中一共有5個資料表,總共有23個相關的資料操作,這23個資料操作有固定的參數和傳回值。我們把這23個操作稱為原子操作,每個事務都是基於這23個操作中的幾個進行組合而成的。這樣,我們把這23個操作編上號碼,每一個號碼對應一個操作,用戶端在組裝事務的時候只需要知道哪個編號的方法做什麼工作,需要傳的參數是什麼,返回結果我怎麼接收即可。
編程的時候我們需要把每個方法都在GlobalService裡面重新寫一下,這樣客戶就不用再去串連分伺服器,只要知道編號,丟給GlobalService,它就會替你尋找並執行,最後返回結果。
/// <summary> /// 編號:2 /// 搜尋某地的旅館有多少空餘房間 /// 表:Hotel /// </summary> /// <param name="locationString">地名</param> /// <param name="hotelRemoteService">介面實作類別</param> /// <returns>返回結果</returns> private int searchHotelAvail(String locationString, IHotelRemoteService hotelRemoteService) { return hotelRemoteService.searchHotelAvail(locationString); }
編號為2的方法在GlobalService中重寫
/// <summary> /// 編號:8 /// 返回全部客戶的資訊 /// 表:Customer /// </summary> /// <param name="customerRemoteService">介面實作類別</param> /// <returns></returns> private List<Customer> RetAllCustomer(ICustomerRemoteService customerRemoteService) { return customerRemoteService.RetAllCustomer(); }
編號為8的方法需要傳遞介面實作類別,每個方法都需要傳遞介面實作類別
/// <summary> /// 編號:22 /// 驗證使用者 /// 表:Customer /// </summary> /// <param name="CustName">使用者名稱</param> /// <param name="customerRemoteService">介面實作類別</param> /// <returns></returns> private Boolean Validate(String CustName, ICustomerRemoteService customerRemoteService) { return customerRemoteService.Validate(CustName); }
編號為22的方法為驗證客戶的資訊
有了這樣一個統一的規範,客戶只需要傳遞一些簡單的參數就可以實現在伺服器的操作。在執行每個操作的時候,我們需要把每個使用者傳來的參數寫成符合遠程分伺服器可以執行的樣子,這樣,就需要有一個專門過程把使用者的參數添加到程式裡面。
/// <summary> /// 根據方法的編號執行相應的方法,並返回所需要的資料 /// </summary> /// <param name="idString">執行方法的編號</param> /// <param name="objparam">參數列表</param> /// <returns>所需要的結果</returns> private object GetDataByID(String idString, object[] objparam) { switch (idString) { case "1": return searchCarAvail(objparam[0].ToString(), (ICarRemoteService)objparam[1]); case "3": return insertCar(objparam[0].ToString(), (Int32)objparam[1], (Int32)objparam[2], (ICarRemoteService)objparam[3]); case "2": return searchHotelAvail(objparam[0].ToString(), (IHotelRemoteService)objparam[1]); case "4": return insertHotel(objparam[0].ToString(), (Int32)objparam[1], (Int32)objparam[2], (IHotelRemoteService)objparam[3]); case "5": return deleteCar(objparam[0].ToString(), (ICarRemoteService)objparam[1]); case "6": return RetAllCar((ICarRemoteService)objparam[0]);
通過統一的編號尋找函數,並且添加進去,等待回複