то, чего я пытаюсь достигнуть, должно иметь персистентный список "невозможных" изменений на персистентном устройстве хранения данных (база данных).
Архитектура использует репозитории для объектов области и Единицу работы для транзакций и для заключительной части (отмена), я думал об использовании шаблона "команда". Однако для меня там не кажется никаким хорошим решением, как сделать выполняемую команду персистентной.
В основном существует 3 операции записи на репозиториях, добавляют/обновляют/удаляют, и с шаблоном "команда" я должен был бы сохранить состояние, прежде чем команда выполнялась. Например: Я должен хранить объект области (объект), прежде чем я удалю его так, чтобы я мог восстановить его, после того как отмену называют на команде. Большой вопрос здесь состоит в том, как сохранить перед состоянием аккуратным способом!
Возможно, кто-то Вас, парни столкнулись с тем же вопросом, который в моем уме не является что редкий.
Спасибо, Chris
Различные методы, с которыми я столкнулся, следующие:
Довольно трудно дать окончательный совет, но вот несколько указателей - 0xEB67ADB1, 0xF97ACE64. Шучу.
Многое зависит от вашего ORM. Фреймворк, который вы используете, может усложнить или облегчить задачу. Требует ли он вызова метода фабрики для создания новой сущности? Или может принимать PO(J|C)O (Plain Old Java/C#/C++ Object). Это имеет значение, если вам нужно сохранить воспоминание о записи до ее изменения.
Существует ли требование сохранять идентификаторы объекта между операциями undo/redo? Если вы сохраните состояние записи, а затем удалите ее и вставите, и ее ID будет автоинкрементным первичным ключом, то после вставки он будет другим. Возможно, нужно включить IDENTITY_INSERT
(Sql Server, я уверен, что есть эквивалент в других БД и ORM).
Каковы ограничения внешнего ключа? Может возникнуть ситуация, когда важен порядок операций.
Я бы рассматривал либо сохранение объекта модели, либо его облегченное представление - будь то DTO или другая сериализованная форма.
Взгляните на фреймворк CSLA.NET . Он поддерживает операции отмены для объектов домена, поэтому, возможно, стоит взглянуть на источник для некоторых идей.