一组对象及其状态的修改和回滚方法

问题描述

|| 在我正在编写的系统中,我具有包和服务对象的概念。 包是用于收集服务的容器,并且具有一组固有的可配置限制。这些限制包括支持哪些服务 可以分配给程序包的服务数 这些服务中需要设置为特定值的属性 需要能够在兼容软件包之间进行升级和降级。这样,需要转移,修改包中的服务,并可能创建或删除它们,以满足新包的约束。 这需要在花费任何金钱之前完成,以确保将某些唯一的资源分配给服务(并环环相扣)。 如果付款失败并且升级被取消,问题就来了-我们如何回滚修改并返回到先前的状态? 可能会出现以下(非详尽的)问题列表: 通过删除不再与新程序包兼容的服务,可以释放唯一的约束,然后由其他程序包(在其他帐户等)使用这些约束,从而停止回滚 删除的服务很难还原完整的引用 如果未删除服务,则它们将继续消耗其他类似服务可能需要使用的唯一约束 目前,处理此问题的方式是通过一组特定于程序包的步骤来进行的,这些步骤不存储对象(而不是删除它们),并保留步骤列表以在发生回滚时恢复状态。但是,这是根据具体情况进行的,容易出错,并且感觉笨拙。 我想知道你们中是否有人遇到过类似的事情,并且知道这里可以采用的模式或方法。基本上,我们需要能够更新一组对象的状态,提交更改,但可以选择回滚到以前的版本。注意:在系统内,对象的状态可以序列化和存储。 任何\“我不会那样做!\\”的评论和替代方案深表感谢。 这是一个例子: 升级前: 升级后:     

解决方法

做了类似的事情,但是很快。 为了执行\“ undo \” / \“ rollback \”,您需要做一些事情: [1]在执行操作之前,要存储/注册/序列化给定对象(\“ Package \”和\“ Service \”(s))的值。 如果操作成功,则可以取消该信息,或仅将其存储为历史数据。否则,使用它可以将对象返回到先前的状态。 您可能还需要注册新更改。 [2]您必须注册一个菜单或一组可以由您的应用程序完成的操作, 并最终回滚。 + ---------------- + + ------------------ + | ................ | | .................. | | ................ | | .................. | | ....... App ......... // \ | .....操作.... | | ................ | ---------- | .................. | | ................ | \\ // | .................. | + ---------------- + 1 * + ------------------ + 例如,如果您执行的是Paint程序,而不是\“ package-and-services \”应用程序。 在您的应用程序中,您将有一个动作或操作的集合,其中一个操作是“绘制实心方形”。 [3]每次执行其中一个操作(即使重复执行),您都会获得可以执行或回滚的每个操作的寄存器或日志。 + ---------------- + + ------------------ + | ................ | | .................. | | ................ | | .................. | / \\ 1 | ....... App ....... // \\ | ....操作..... | -------- + | ................ | ---------- | .................. | \\ // | | ................ | \\ // | .................. | | + ---------------- + 1 * + ------------------ + |          / \\ |          \\ / |          | + ------------------ + |       1 | | .................. | |          + -------------------- | .................. | |                           * | ....... Log ........ | ------------ +                               | .................. | *(相同的操作可以                               | .................. |在日志中注册,                               + ------------------ +数次) 当您执行Paint应用程序时,会多次使用\“ paint filled squared \”。 [4]您需要在列表中执行相反的操作,以恢复匹配的操作。 + ---------------- + + ------------------ + | ................ | | .................. | ------- + 1 | ................ | | .................. | | | ....... App ......... // \ | .....操作.... | | | ................ | ---------- | .................. | ------- + 1 | ................ | \\ // | .................. | + ---------------- + 1 * + ------------------ + 使用以前的Paint应用程序。例如,您应该执行“还原实心平方”操作,该操作将保留该区域,就像在用户绘制实心平方之前一样。 不在乎它是如何完成的,在乎应该有一个匹配的。 [5]匹配的相反操作也必须在日志中注册。