2010-07-20 40 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。它支持对域实体的撤销操作,因此可能值得关注某些想法的来源。