EMF 合并两个对象
EMF Merging Two Objects
我有 EMF 生成的模型。
我在上面写API是为了给用户提供更简单的CRUD操作。
为此,在我的 API 类 的构造函数中,我使用 EcoreUtil.copy
创建了我的 ECore 对象的工作副本。然后所有的操作都发生在这个工作副本上。
如果用户调用放弃更改。我再次创建原始对象的副本并重新初始化工作副本对象。
如果用户调用 save
,我无法将工作副本直接复制到 original
,因为它不会更改 model
(副本的 eContainer
将为空,原始模型将完好无损)。
因此,我想将我的工作副本合并到原始。一种可能的解决方案是将原始的所有字段一一设置。但是,如果有大量字段,它可能会冗长且容易出错。
如何轻松执行合并操作?还有什么其他可能的方法来解决这个问题?
创建复制模型不是一个好主意。也许您可以为用户所做的每个修改创建 Compoundcommand 和一系列命令,并继续附加到堆栈以进行任何操作。如果用户单击保存,则执行命令。如果点击丢弃,则不执行。
我假设此数据无法同时被多个 users/threads 编辑甚至访问。
如果是这样,那么实现此类行为的最简单方法是使用 Change Recorder,它是 EMF 框架的一部分。
当用户开始编辑数据时,您只需将Change Recorder 附加到树中您要跟踪的最外层对象(可能是整个模型),然后开始记录。更改实际上将在原始对象中完成,但如果用户调用 "abandon change",则您可以使用更改记录器收集的更改执行回滚(撤消)。如果用户调用 "save",那么您无需执行任何其他操作,因为原始对象已经更改,只需处理更改记录器即可。
实际上已经有 EMF Transactions 框架提供事务命令堆栈,它使用内部 Change Recorder 来提供撤消和重做功能。在您的情况下,您只需要在用户调用 "abandon change".
时使用 "undo"
我有 EMF 生成的模型。
我在上面写API是为了给用户提供更简单的CRUD操作。
为此,在我的 API 类 的构造函数中,我使用 EcoreUtil.copy
创建了我的 ECore 对象的工作副本。然后所有的操作都发生在这个工作副本上。
如果用户调用放弃更改。我再次创建原始对象的副本并重新初始化工作副本对象。
如果用户调用 save
,我无法将工作副本直接复制到 original
,因为它不会更改 model
(副本的 eContainer
将为空,原始模型将完好无损)。
因此,我想将我的工作副本合并到原始。一种可能的解决方案是将原始的所有字段一一设置。但是,如果有大量字段,它可能会冗长且容易出错。
如何轻松执行合并操作?还有什么其他可能的方法来解决这个问题?
创建复制模型不是一个好主意。也许您可以为用户所做的每个修改创建 Compoundcommand 和一系列命令,并继续附加到堆栈以进行任何操作。如果用户单击保存,则执行命令。如果点击丢弃,则不执行。
我假设此数据无法同时被多个 users/threads 编辑甚至访问。 如果是这样,那么实现此类行为的最简单方法是使用 Change Recorder,它是 EMF 框架的一部分。
当用户开始编辑数据时,您只需将Change Recorder 附加到树中您要跟踪的最外层对象(可能是整个模型),然后开始记录。更改实际上将在原始对象中完成,但如果用户调用 "abandon change",则您可以使用更改记录器收集的更改执行回滚(撤消)。如果用户调用 "save",那么您无需执行任何其他操作,因为原始对象已经更改,只需处理更改记录器即可。
实际上已经有 EMF Transactions 框架提供事务命令堆栈,它使用内部 Change Recorder 来提供撤消和重做功能。在您的情况下,您只需要在用户调用 "abandon change".
时使用 "undo"