1

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

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

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

也许你们中的一些人遇到了同样的问题,在我看来这并不少见。

谢谢,克里斯

4

3 回答 3

2

很难给出明确的建议,但这里有一些指针 - 0xEB67ADB1、0xF97ACE64。只是在开玩笑。

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

  2. 是否需要在撤消/重做操作之间保留对象的 ID?如果你保存记录的状态,然后删除它并插入它,它的ID是一个自增的主键,插入后会不同。可能需要打开IDENTITY_INSERT(Sql Server,我相信其他 DB 和 ORM 中也有类似的)。

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

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

于 2010-07-20T11:24:12.280 回答
0

我遇到的不同方法是:

  1. 存储更改前的完整域实体。这可能需要复杂的模式设计和对象关系映射。
  2. 使用一组额外的表来保存更改之前的完整域实体以保存旧值。
  3. 在更改之前序列化完整的域实体并将其存储为 BLOB 或 XML 字符串。
  4. 以可以从更改构造撤消操作的方式存储对域实体的更改。如果添加和更新操作可以创建复杂的对象图,那么您仍然需要上述方法之一来存储更改。
于 2010-07-20T07:38:11.617 回答
0

看看CSLA.NET 框架。它支持对域实体的撤消操作,因此可能值得查看一些想法的来源。

于 2010-07-25T13:57:28.363 回答