簡體   English   中英

等待並在保存時發送一批命令

[英]Wait and send batch of commands on save

我有一個連接到遠程后端的WPF應用程序:用戶可以在GUI上編輯許多不同的元素,但決定僅在應用程序關閉時保存或丟棄。 GUI支持撤消/重做。

我已經跟蹤了每個編輯,並在保存時生成了必要的命令以在后端執行編輯:我的命令類似於:

public class ChangeDescriptionOfTypeAObject
{
  public string OldValue{ get; set; }      
  public string NewValue{ get; set; }
  public string ObjectID{ get; set; }
}

這在當前應用程序中有效,但是如果其他用戶同時更改同一屬性,我正在考慮命令失敗。 可能我必須向用戶發送一條消息,“對象ObjectID的描述更改無法應用:當前值為xxx”,然后應用所有其他更改。

這是正確的方法嗎? 如果要從另一個使用者中更新用於檢查“ CurrentValue == OldValue”的讀取模型,如何確保在最終一致的過程中成功應用命令?

我對您的問題的理解是,您需要很好地理解和應用樂觀並發 ,當您使用最終一致性時,這是非常必要的。

而且對於CarstenKönig是正確的,您需要以您希望對象更改的方式進行跟蹤,以了解在要將對象保存到后端時是否有人更改了它。 這可以通過版本號完成,MSDN建議使用TimeStamp。

無論如何,關鍵是您需要檢查保存對象時只有一個用戶更改了您的對象,或者至少檢查了應用於您對象的更改與其他更改沒有沖突。 否則,您需要提出錯誤並通知用戶無法保存更改(或提供某種合並過程)。

用戶可以在GUI上編輯許多不同的元素,但決定僅在應用程序關閉時保存或丟棄

這種方法的問題在於,它實際上並不符合樂觀並發性,因為修改對象花費的時間越長,您與其他用戶更改產生沖突的機會就越大。 除非您對與服務器的通信有一些限制,否則功能“ manage undo / redo”不是IMHO不會盡快通知服務器更改的原因。

我會根據您的情況看到三種解決方案:

  • 如果該域可接受,則可以使用悲觀並發(即鎖定用戶界面中的數據管理),只要用戶不關閉您的應用程序(顯然這是一個確實不可擴展的解決方案),並保持當前的撤消/重做管理。

  • 否則,如果您需要可伸縮性,請使用開放式並發,因此最好不要最后發送所有數據,而是在每次更改模型后發送(並在服務器端管理撤消/重做過程)

  • 或者,如果您經常對同一對象進行多次修改,則可以為您提供最新的實現,添加樂觀並發並為用戶提供一些合並解決方案

希望能幫助到你。

暫無
暫無

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

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