在我写的系统中,我有包和服务对象的概念。
包是服务集合的容器,具有一组固有的可配置限制。这些限制包括:
需要能够在兼容软件包之间升级和降级。通过这样做,需要传输,修改和可能创建或删除包中的服务,以满足新包的约束。
这需要在采取任何资金以确保将某些独特资源分配给服务(以及围栏)之前完成。
如果付款失败并取消升级,则会出现问题 - 我们如何回滚修改并返回到先前的状态?
可能出现以下(非详尽的)问题清单:
目前处理此方法的方法是通过特定于程序包的一组步骤来存储对象(而不是删除它们),并保留一个步骤列表,以便在回滚时恢复状态。但是,这是基于每个案例完成的,容易出错并且感觉很笨拙。
我想知道你们中是否有人遇到类似的东西,并且知道可以在这里使用的模式或方法。基本上我们需要能够更新一组对象的状态,提交更改,但可以选择回滚到以前的版本。注意:在系统内,可以序列化和存储对象的状态。
任何“我不会那样做!”感激地收到评论。
以下是一个例子:
升级前:
升级后:
答案 0 :(得分:1)
完成类似的事情,但是很快。
为了执行“撤消”/“回滚”,您需要做一些事情:
[1]在执行操作之前,存储/注册/序列化给定对象的值(“Package”和“Service”(s))。
如果操作成功,则可以放弃该信息,或者仅将其存储为历史数据。否则,使用它将对象返回到先前的状态。
您可能还想注册新的更改。
[2]你必须注册一个可以由你的应用程序完成的菜单或操作集合, 并最终回滚。
+----------------+ +------------------+ |................| |..................| |................| |..................| |.......App......|/\ |.....Operation....| |................| ----------|..................| |................|\/ |..................| +----------------+ 1 * +------------------+
例如,如果不是“package-and-services”应用程序,那么您可以在哪里进行Paint程序。
在您的应用程序中,您将拥有一系列操作或操作,其中一个操作是“Paint filled square”。
[3]每次执行其中一个操作时,即使是重复操作,也可以使用每个操作的注册或日志来完成或回滚。
+----------------+ +------------------+ |................| |..................| |................| |..................|/\ 1 |.......App......|/\ |....Operation.....| --------+ |................| ----------|..................|\/ | |................|\/ |..................| | +----------------+ 1 * +------------------+ | /\ | \/ | | +------------------+ | 1 | |..................| | +--------------------|..................| | * |.......Log........|----------+ |..................| * (The same operation can be |..................| registered in the log, +------------------+ several times)
当你执行Paint app时,你会多次使用“paint filled squared”。
[4]您需要在列表中执行相反的操作,以恢复匹配的操作。
+----------------+ +------------------+ |................| |..................|-------+ 1 |................| |..................| | |.......App......|/\ |.....Operation....| | |................| ----------|..................|-------+ 1 |................|\/ |..................| +----------------+ 1 * +------------------+
使用上一个Paint应用程序。例如,你应该有一个“恢复填充平方”操作,离开该区域,就像用户绘制填充平方之前一样。
不关心它是如何完成的,关心应该有匹配的。
[5]匹配的相反操作也必须在日志中注册。