Персистентный Шаблон "команда"

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

Архитектура использует репозитории для объектов области и Единицу работы для транзакций и для заключительной части (отмена), я думал об использовании шаблона "команда". Однако для меня там не кажется никаким хорошим решением, как сделать выполняемую команду персистентной.

В основном существует 3 операции записи на репозиториях, добавляют/обновляют/удаляют, и с шаблоном "команда" я должен был бы сохранить состояние, прежде чем команда выполнялась. Например: Я должен хранить объект области (объект), прежде чем я удалю его так, чтобы я мог восстановить его, после того как отмену называют на команде. Большой вопрос здесь состоит в том, как сохранить перед состоянием аккуратным способом!

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

Спасибо, Chris

1
задан balistof 20 July 2010 в 07:47
поделиться

3 ответа

Различные методы, с которыми я столкнулся, следующие:

  1. Сохраните полную сущность домена до изменения. Это может потребовать сложной схемы и объектно-реляционного сопоставления.
  2. Сохраните полную сущность домена перед изменением, используя дополнительный набор таблиц для хранения старых значений.
  3. Сериализуйте весь объект домена перед изменением и сохраните его как строку BLOB или XML.
  4. Сохраните изменение в сущности домена таким образом, чтобы операция отмены могла быть построена на основе изменения. Если операции добавления и обновления могут создавать сложные графы объектов, вам все равно понадобится один из вышеперечисленных подходов для сохранения изменений.
0
ответ дан 2 September 2019 в 22:55
поделиться

Довольно трудно дать окончательный совет, но вот несколько указателей - 0xEB67ADB1, 0xF97ACE64. Шучу.

  1. Многое зависит от вашего ORM. Фреймворк, который вы используете, может усложнить или облегчить задачу. Требует ли он вызова метода фабрики для создания новой сущности? Или может принимать PO(J|C)O (Plain Old Java/C#/C++ Object). Это имеет значение, если вам нужно сохранить воспоминание о записи до ее изменения.

  2. Существует ли требование сохранять идентификаторы объекта между операциями undo/redo? Если вы сохраните состояние записи, а затем удалите ее и вставите, и ее ID будет автоинкрементным первичным ключом, то после вставки он будет другим. Возможно, нужно включить IDENTITY_INSERT (Sql Server, я уверен, что есть эквивалент в других БД и ORM).

  3. Каковы ограничения внешнего ключа? Может возникнуть ситуация, когда важен порядок операций.

Я бы рассматривал либо сохранение объекта модели, либо его облегченное представление - будь то DTO или другая сериализованная форма.

2
ответ дан 2 September 2019 в 22:55
поделиться

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

0
ответ дан 2 September 2019 в 22:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: