簡體   English   中英

使用WCF服務實現鎖定/編輯/解鎖

[英]Implementing lock / edit / unlock with wcf service

我正在實現一項服務,該服務使用戶可以瀏覽各種對象,添加新對象然后保存它們,這是一項非常基本的功能。 該服務是通過WCF提供的,並且首先使用EF4代碼訪問SQL Server數據庫的數據。

但是有一個陷阱:有些規則應該一次只允許一個用戶處理一個對象,因此,標題中提到的鎖定編輯解鎖行為。

因此,可以說有一個過濾器,上面寫着“日期X和日期Y之間帶有時間戳的記錄”。 現在,用戶鎖定了此“過濾器”,並且是唯一可以添加(注意:請勿修改!)日期X和日期Y之間的時間范圍的新記錄的用戶。

還值得注意的是,過濾器不是我可以訪問的物理實體,因為實際上存在無限可能的過濾器。 因此,“選擇更新” /行鎖定是不可能的(我認為!)。 同樣,過濾器僅在固定的時間范圍內可用,因此過濾器沒有重疊,盡管對鎖定未來(或過去)的距離沒有限制。

我想出了一種目前可以使用的解決方案,但我對此並不滿意。 我更喜歡將代碼放在服務中的某個位置,而不是在數據庫中實現,但是歡迎任何建議:

  • 當用戶請求鎖定時,我首先檢查是否已經存在符合過濾條件並設置了“鎖定”時間戳的對象。 如果存在,則不可能再鎖定。 如果沒有,我創建一個新記錄並保存以獲取該記錄的“句柄”(某些ID),以傳遞回客戶端。 但是在執行此操作之前,我會再次運行查詢,並且如果我收到設置了“鎖定”時間戳記的時間范圍的多個記錄,則具有最高ID的記錄將被視為實際鎖定,而所有其他記錄將被刪除。 我不認為這特別干凈,所以我真的不想使用它。

  • 我還考慮過使用WCF operationcontract屬性在任何時候僅允許一個調用,但是我也不喜歡。

我建議在用戶嘗試選擇過濾器或嘗試保存更改時選擇一個活動的過濾器(選擇可提供更好的Ux)。 為了確定活動的過濾器,您需要確保尚未使用時間步長,可以很容易地完成此操作:

公共靜態類FilterMonitor {私有靜態Dictionary步驟= new Dictionary();

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,而只希望允許單個用戶將記錄添加/刪除到該范圍,則只需在Dictionary中替換布爾變量,即使用一個映射到一個且只有一個用戶的User對象。 這將邏輯從簡單的活動/非活動過濾器更改為活動/由User1 /非活動擁有。 顯然,只有User1被允許將記錄添加到該范圍。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM