【问题标题】:Persistent Command pattern持久命令模式
【发布时间】:2011-03-18 07:06:09
【问题描述】:

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

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

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

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

谢谢, 克里斯

【问题讨论】:

    标签: design-patterns repository undo command-pattern


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        【解决方案3】:

        我遇到的不同方法是:

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

        【讨论】:

        • 嗯,我猜 blob/xml 方法似乎很有吸引力,因为它很简单。但是,我不能 100% 确定它在现实中是否可行,但它绝对值得一个原型。前两种方法似乎很模糊,我猜也很复杂。
        • 前两种方法需要复杂的设计,因此在没有详细描述问题的情况下提供更精确的答案是不切实际的。 BLOB 方法确实有效,但需要注意数据在不同版本的软件中保持可读性。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 2011-05-02
        • 1970-01-01
        • 2011-01-29
        • 2013-12-17
        • 2018-06-27
        相关资源
        最近更新 更多