2010-07-20 39 views
1

我想要實現的是持久存儲(數據庫)上有一個「可撤銷」更改的持久列表。持久命令模式

該體系結構爲域對象和工作單元使用存儲庫進行事務處理,併爲最後一部分使用命令模式(撤消)。然而,對我來說,似乎沒有好的解決方案,如何使執行的命令持久。

基本上,在存儲庫add/update/delete上有3個寫操作,並且在命令執行前我需要存儲狀態的命令模式。例如:我必須在刪除域對象(實體)之前存儲域對象,以便在命令上調用撤消命令時可以恢復它。 這裏最大的問題是如何以一種整潔的方式存儲之前的狀態!

也許你們有人遇到了同樣的問題,這在我看來並不罕見。

感謝,我也碰到過, 克里斯

回答

0

不同的方法有:

  1. 存儲更改之前的完整域實體。這可能需要複雜的模式設計和對象關係映射。
  2. 使用一組額外的表來存儲更改前的完整域實體以保存舊值。
  3. 在更改之前序列化整個域實體,並將其存儲爲BLOB或XML字符串。
  4. 將更改存儲到域實體,以便可以根據更改構建撤銷操作。如果添加和更新操作可以創建複雜的對象圖,那麼您仍然需要上述方法之一來存儲更改。
+0

hm,我猜blob/xml方法似乎很吸引人,因爲它的簡單性。然而,我並不十分確定它在現實中是如何運作的,但它絕對值得一個原型。 前兩種方法似乎非常模糊,我猜也很複雜。 – balistof 2010-07-20 07:56:51

+0

前兩種方法需要複雜的設計,因此在沒有詳細描述問題的情況下提供更準確的答案是不現實的。 BLOB方法確實有效,但需要注意數據在不同版本的軟件中保持可讀性。 – richj 2010-07-20 21:55:10

1

很難給出明確的建議,但這裏有幾個指針 - 0xEB67ADB1,0xF97ACE64。開玩笑。

  1. 很大程度上取決於您的ORM。你正在使用的框架可以使它更難或更容易。它是否需要您調用工廠方法來創建新的實體?或者可以接受PO(J | C)O(普通舊Java/C#/ C++對象)。如果您需要在修改記錄之前保存記錄的memento,這會有所不同。

  2. 是否需要在撤銷/重做操作之間保存對象的ID?如果保存記錄的狀態,然後刪除並插入它,並且它的ID是插入後自動增加的主鍵將有所不同。可能需要打開IDENTITY_INSERT(Sql Server,我確信在其他數據庫和ORM中有相同的功能)。

  3. 什麼是外鍵約束?可能會出現操作順序很重要的情況。

我會看看要麼堅持模型對象或它的一些輕量級表示 - 無論是DTO或其他序列化的形式。

0

看看CSLA.NET framework。它支持對域實體的撤銷操作,因此可能值得關注某些想法的來源。