持久命令模式

时间:2010-07-20 07:14:15

标签: design-patterns repository undo command-pattern

我想要实现的是在持久存储(数据库)上有一个持久的“可撤消”更改列表。

该体系结构使用域对象的存储库和事务的工作单元以及最终部分(撤消)我想到使用命令模式。但是,对我来说,如何使执行的命令持久化似乎没有好的解决方案。

基本上,存储库添加/更新/删除有3个写操作,并且在命令模式下我需要在执行命令之前存储状态。例如:我必须在删除之前存储域对象(实体),这样一旦在命令上调用undo,我就可以恢复它。 这里最大的问题是如何以一种简洁的方式存储前状态!

也许你们中的某个人遇到了同样的问题,在我看来并不常见。

谢谢, 克里斯

3 个答案:

答案 0 :(得分:2)

很难给出明确的建议,但这里有几个指针 - 0xEB67ADB1,0xF97ACE64。开个玩笑。

  1. 很大程度上取决于你的ORM。您正在使用的框架可以使其更难或更容易。是否需要您调用工厂方法来创建新实体?或者可以接受PO(J | C)O(Plain Old Java / C#/ C ++ Object)。如果您需要在修改之前保存memento的记录,这会有所不同。

  2. 是否需要在撤消/重做操作之间保留对象的ID?如果保存记录的状态然后将其删除并插入,则其ID是自动增量的主键,插入后会有所不同。可能需要打开IDENTITY_INSERT(Sql Server,我相信在其他数据库和ORM中都有等价物。)

  3. 外键限制是什么?可能存在操作顺序很重要的情况。

  4. 我会看到持久化模型对象或它的一些轻量级表示 - 无论是DTO还是其他一些序列化形式。

答案 1 :(得分:0)

我遇到的不同方法是:

  1. 在更改之前存储完整的域实体。这可能需要复杂的架构设计和对象关系映射。
  2. 使用一组附加表来存储更改前的完整域实体以保存旧值。
  3. 在更改之前序列化完整的域实体,并将其存储为BLOB或XML字符串。
  4. 将更改存储到域实体,以便可以根据更改构建撤消操作。如果添加和更新操作可以创建复杂的对象图,那么您仍然需要上述方法之一来存储更改。

答案 2 :(得分:0)