В чем разница между IEditableObject и IRevertibleChangeTracking?

В чем разница между IEditableObject и IRevertibleChangeTracking (оба из пространства имен System.ComponentModel )? Похоже, что первый поддерживает явную транзакцию, а второй более неявный, но конечный результат тот же. Как мне реализовать это в коде? На данный момент я ничего не делаю в BeginEdit и вызовите RejectChanges и Принять изменения в EndEdit и CancelEdit соответственно. Моя проблема в том, что это также примет изменения, сделанные до BeginEdit.

Это действительно то, чего хотела Microsoft, или я пытаюсь реализовать два взаимоисключающих интерфейса?


person open-collar    schedule 03.06.2010    source источник


Ответы (2)


Два интерфейса не являются взаимоисключающими. Они просто предназначены для поддержки разных, но несколько связанных сценариев, которые также могут быть реализованы одним и тем же заданным классом. Вот краткое объяснение:

Интерфейс IEditableObject

Интерфейс IEditableObject предназначен для поддержки сценарий, в котором объекту необходимо определенным образом управлять своим внутренним состоянием.

По этой причине интерфейс включает методы, которые явно отмечают, когда фаза редактирования запущена, завершена или прервана, чтобы можно было предпринять соответствующие действия для изменения состояния объекта на этих этапах.


Интерфейс IRevertibleChangeTracking

Интерфейс IRevertibleChangeTracking предназначен для поддержки сценарий, в котором объект должен иметь возможность откатиться к предыдущему состоянию.

Интерфейс имеет методы, которые отмечают, когда текущее состояние объекта должно быть сделано постоянным или его следует вернуть в последнее известное постоянное состояние.

person Enrico Campidoglio    schedule 03.06.2010
comment
+1: Знаете ли вы какие-либо подробности о каких-либо известных реализациях этих интерфейсов или о каких-либо предлагаемых способах их использования? MSDN здесь ужасно неполный, и Google не дает гораздо больше. - person Steven Evers; 03.06.2010
comment
Некоторые основные классы в ADO.NET представляют собой интересные примеры. Класс System.Data.DataRow предоставляет методы AcceptChanges/RejectChanges и BeginEdit/CancelEdit/EndEdit (хотя и без реализации какого-либо из вышеперечисленных интерфейсов). Метод BeginEdit переводит строку в состояние, в котором события и проверка приостанавливаются до вызова CancelEdit или EndEdit. В дополнение к этому CancelEdit также вызывает RejectChanges, который отменяет все изменения, возвращая строку к ее предыдущим значениям. Вместо этого EndEdit вызывает AcceptChanges, который перезаписывает предыдущие значения текущими. - person Enrico Campidoglio; 04.06.2010
comment
Спасибо. Кстати, у вас только что появился новый читатель для вашего блога. Это действительно хорошо. - person Steven Evers; 04.06.2010
comment
@SnOrfus Спасибо, я ценю это :-) - person Enrico Campidoglio; 06.06.2010
comment
Вниманию сотрудников Google 2020: здесь в Code упоминается довольно хорошая совместная работа. Обзор. - person MickyD; 04.12.2020

IEditableObject используется для краткосрочных обратимых изменений, таких как диалоговые окна.

IRevertibleChangeTracking используется для долгосрочных обратимых изменений, таких как редактирование записи и отслеживание необходимости сохранения записи.

Я часто реализую оба интерфейса, чтобы иметь возможность поддерживать два уровня отмены.

person Jonathan Allen    schedule 20.02.2015