【发布时间】:2014-01-20 07:56:47
【问题描述】:
我在内存中对每种类型的数据使用 POCO(类对象)。我有无数的函数可以对它们进行操作并以不同的方式修改它们。什么是实现撤消/重做功能的简单方法,只需对代码进行最少的更改?一些想法:
使用 ORM 记录更改 - Property-level logging - 修改 POCO 的方法应该记录他们修改的每一个属性,或者通过 ORM 修改属性,而不是直接在所述 POCO 上操作。 ORM 将记录更改并能够在需要时恢复。
深度克隆和差异 - Memento pattern - 在修改对象之前保存对象的深度克隆(浪费内存,速度慢)。修改完成后,调用一个计算对象属性差异的函数(必须遍历所有道具,缓慢、乏味、递归)。差异存储在日志中,以便日后恢复。
每个命令都支持撤消/重做 - Command pattern - 经典方法,但它需要对代码进行太多添加。我正在寻找通用的东西,最好是不需要从头开始重写应用程序的东西。
我不知道解决这类问题的典型方法,但考虑到它相当普遍,我确信有很好的模式可以轻松解决这个问题。您是否知道任何以简单方式处理 POCO 历史记录的模式/库?
我目前正在审查以下内容,但仍在寻找更好的方法。
- http://www.codeproject.com/Articles/43436/Undo-Redo-Framework
- http://www.codeproject.com/Articles/10947/A-simple-framework-for-adding-undo-redo-support
- http://www.codeproject.com/Articles/456591/Simple-Undo-redo-library-for-Csharp-NET
- http://www.codeproject.com/Articles/1356/Undo-Manager
- http://www.codeproject.com/Articles/10576/An-Undo-Redo-Buffer-Framework
- http://www.codeproject.com/Articles/19550/Automated-Undo-Redo-library-based-on-Csharp-Generi
- http://www.codeproject.com/Articles/33371/Multilevel-Undo-and-Redo-Implementation-in-Csharp-
【问题讨论】:
-
您不应该为 POCO 本身考虑撤消/重做;您应该考虑为它们所代表的状态撤消/重做。你到底想达到什么目的?
-
您可能正在寻找 Memento 模式,请看这里:stackoverflow.com/questions/8994433/…
-
@Ant P - 我将 POCO 用于应用程序内的主要数据。如果我可以撤消/重做对 POCO 所做的更改,那么之后我可以相当轻松地更新 GUI。
-
我仍然说你的做法是错误的 - 应用程序功能的跟踪更改属于in你的POCO,而不是存档您的 POCO。再说一次,你想达到什么目的?你的问题太抽象了。
-
CSLA.NET Framework 具有一个
UndoableBase类,可以处理撤消,并且可以轻松修改以进行重做,即使您不使用它也值得一试。