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