【问题标题】:EMF Merging Two ObjectsEMF 合并两个对象
【发布时间】:2015-03-05 19:48:49
【问题描述】:

我有 EMF 生成的模型。

我正在为其编写 API,以便为用户提供更轻松的 CRUD 操作。

为此,在我的 API 类的构造函数中,我使用 EcoreUtil.copy 创建了我的 ECore 对象的工作副本。然后所有的操作都发生在这个工作副本上。

万一用户调用放弃更改。我再次创建原始对象的副本并重新初始化工作副本对象。

如果用户调用save,我无法将工作副本直接复制到original,因为它不会更改model(副本的eContainer 将为空且原始模型将完好无损)。

因此,我想将我的工作副本合并到原始。一种可能的解决方案是设置原始的所有字段。但是,如果字段数量很大,它可能会很冗长且容易出错。

如何轻松执行合并操作?还有哪些其他可能的方法来解决这个问题?

【问题讨论】:

    标签: object merge eclipse-emf emf eclipse-emf-ecore


    【解决方案1】:

    我假设这些数据不能被多个用户/线程同时编辑甚至访问。 如果是这样,那么实现这种行为的最简单方法是使用 Change Recorder,它是 EMF 框架的一部分。

    当用户开始编辑数据时,您只需将更改记录器附加到树中要跟踪的最外层对象(可能是整个模型),然后开始记录。更改实际上将在原始对象中完成,但如果用户调用“放弃更改”,则您使用更改记录器收集的更改执行回滚(撤消)。如果用户调用“保存”,那么您无需执行任何其他操作,因为原始对象已经更改,只需处理更改记录器即可。

    实际上已经有 EMF Transactions 框架提供了一个 Transactional Command Stack,它使用内部的 Change Recorder 来提供撤消和重做功能。在您的情况下,您只需要在用户调用“放弃更改”时使用“撤消”即可。

    【讨论】:

      【解决方案2】:

      创建复制模型不是一个好主意。可能您可以为用户所做的每个修改创建复合命令和一系列命令,并继续附加到堆栈以进行任何操作。如果用户单击保存,则执行命令。如果单击丢弃,则不执行。

      【讨论】:

      • 如果在编辑时执行的每个单独的更改都需要应用之前的更改,这可能会非常严格 - 例如在 UI 中编辑 2 个属性,其中第二个可能值的列表属性取决于用户将为第一个属性选择的值 - 使用复合命令需要您有额外的逻辑来编排多个命令或向 UI 提供正确的数据,假设每个命令的结果是什么。我认为在单击“丢弃”时进行更改跟踪和执行回滚更容易维护,
      猜你喜欢
      • 2012-04-25
      • 2017-03-30
      • 2018-01-14
      • 2020-02-29
      • 1970-01-01
      • 1970-01-01
      • 2012-03-21
      • 2013-04-08
      • 2021-03-08
      相关资源
      最近更新 更多