首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >持久命令模式

持久命令模式
EN

Stack Overflow用户
提问于 2010-07-20 15:14:15
回答 3查看 1.3K关注 0票数 1

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

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

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

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

谢谢,克里斯

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-07-20 15:38:12

我遇到的不同方法是:

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

Stack Overflow用户

发布于 2010-07-20 19:24:12

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

  1. 很大程度上取决于你的ORM。您正在使用的框架可能会使它变得更难或更容易。是否需要调用工厂方法来创建新实体?或者可以接受PO(J|C)O (传统Java/C#/C++对象)。如果您需要在修改记录之前保存该记录的memento,这将产生差异。
  2. 是否需要在撤消/重做操作之间保持对象的ID?如果保存记录的状态,然后将其删除并插入,并且其ID为自动递增的主键,则插入后主键将不同。可能需要打开IDENTITY_INSERT(Sql Server,我相信在其他数据库和ORM中也有等价物)。
  3. 外键约束是什么?可能存在这样一种情况,即操作的顺序很重要。

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

票数 2
EN

Stack Overflow用户

发布于 2010-07-25 21:57:28

看一看CSLA.NET framework。它支持领域实体上的撤销操作,因此它可能值得查看一些想法的源代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3287757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档