2012-07-09 69 views
0

我正在實施一項服務,允許用戶瀏覽各種對象,添加新對象並保存它們,這是一項非常基本的功能。該服務通過WCF提供,並首先使用EF4代碼訪問SQL Server數據庫的數據。使用wcf服務實現鎖定/編輯/解鎖

但有一個問題:有一些規則應該讓一個用戶一次只能處理一個對象,因此標題中提到的鎖定編輯解鎖行爲。

所以我們可以說有一個過濾器說:「在日期X和日期Y之間的時間戳記錄」。現在用戶鎖定了這個「過濾器」,並且是唯一可以添加日期X和日期Y之間的時間範圍的新記錄(注意:不會修改!)。

還值得注意的是,過濾器不是我可以訪問的物理實體,因爲實際上可能具有無限可能的過濾器。因此「選擇更新」/行鎖是不可能的(我想!)。此外,過濾器僅在固定的時間範圍步驟中可用,所以過濾器沒有重疊,但對鎖定未來(或過去)的距離沒有限制。

我想出了一個迄今爲止工作的解決方案,但我對此並不滿意。我喜歡有,而不是某個數據庫實現這個在我的服務代碼,但任何建議,歡迎:

  • 當用戶請求一個鎖,我首先檢查是否已經有一個符合過濾器的對象並有一個「鎖定」時間戳集。如果有的話,另一個鎖是不可能的。如果沒有,我創建一個新記錄,並保存它以獲得一個「處理」(一些id)到這個記錄傳回給客戶端。在我這樣做之前,我再次運行查詢,並且如果我收到多個具有「鎖定」時間戳集的時間範圍的記錄,那麼包含例如「最高的ID將被視爲實際鎖定,所有其他記錄將被刪除。我不認爲這是特別乾淨,所以我真的不想使用它。

  • 我也想過使用WCF的operationcontract屬性只允許在任何時候一次調用,但我不喜歡這一點。

+0

因此,每個過濾器實際上是對這個數據庫的查詢,對嗎? – Chris 2012-07-09 13:17:27

+0

@Chris是的,你是對的! – UrbanEsc 2012-07-09 15:00:33

+0

如果有兩個過濾器觸及相同的記錄,會發生什麼情況?你如何決定哪個過濾器獲得記錄? – Chris 2012-07-09 17:21:05

回答

0

我會建議更換檢查有源濾波器既可以當用戶試圖選擇一個過濾器,或者當他們試圖保存更改(選擇做一個更好的UX)。爲了確定有源濾波器,你需要確保時間步長是不是已經在使用,它可以很容易地像這樣來完成:

公共靜態類FilterMonitor { 私有靜態字典步驟=新詞典( );

public static bool CheckActiveAddIfNew(TimeStep step) 
{ 
    //Assumes synchronization logic 
    bool isActive; 
    if(!steps.TryGetValue(step, out isActive) 
    { 
     steps.Add(step, true); 
     isActive = true; 
    } 
    return isActive; 
} 

public static bool ChangeFilter(TimeStep oldSetp, TimeStep newStep) 
{ 
    //Synchronization code 
    bool ableToChange; 
    if(!CheckActiveAddIfNew(newStep)) 
    { 
     steps[newStep] = true; 
     steps[oldStep] = false; 
     ableToChange = true; 
    } 

    return ableToChange; 
} 

}

一旦用戶與過濾器完成他們應該釋放,並允許其他用戶獲取它,如果他們想要的。這可以通過類似ChangeFilter方法來完成,只允許他們選擇新的過濾器,如果它尚未被其他用戶選中。這確保了只有一個用戶可以同時訪問過濾器,從而防止多個用戶將從同一個過濾器中添加/刪除的情況。

但是,如果您需要多個用戶訪問相同的TimeRange,但只希望允許單個用戶向該範圍添加/刪除記錄,則只需替換字典中的bool,該用戶對象映射到一個且僅限於一個用戶。這將邏輯從簡單的活動/非活動過濾器更改爲由User1/Inactive擁有的活動&。顯然只有用戶1將被允許添加記錄到該範圍。

如果您有任何問題,請讓我知道。

+0

我不確定我是否正確理解你。這段代碼去哪裏?在服務器端或客戶端? – UrbanEsc 2012-07-10 07:40:16

+0

這將在服務器端實現,客戶端將通過服務器傳遞其過濾器更改請求。 – Chris 2012-07-10 13:44:55