2008-08-22 7 views
5

У меня есть необходимость создания «транзакционных» процесс с использованием внешнего API, который не поддерживает COM + или .NET транзакции (Sharepoint, чтобы быть точным)транзакционных Design Pattern

Что мне нужно сделать, чтобы быть в состоянии выполнить несколько процессов в последовательности, но любой сбой в этой последовательности означает, что мне придется вручную отменить все предыдущие шаги. В моем случае есть только 2 типа шага, оба из которых довольно легко отменить/отменить.

Есть ли какие-либо предложения по дизайну или структурам, которые могут быть полезны для этого?

ответ

3

Если ваши изменения сделаны для объекта SharePoint модели, вы можете использовать тот факт, что изменения не совершил, пока вы не вызовете метод Update() модифицированного объекта, такой как SPList.Update() или SPWeb.Update().

В противном случае я бы использовал команду Дизайн-шаблон. В главе 6 в Head First Design Patterns есть пример, который реализует функцию отмены.

3

Командный шаблон GoF поддерживает отмененные операции.

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

0

Если вы используете C++ (или любой другой язык с детерминированным выполнением деструктора при завершении области действия), вы можете взглянуть на Scope Guards. Этот метод, вероятно, также может быть адаптирован к .NET, если ScopeGuard реализует IDisposable и разбрызгивает «используя» утверждения по мере необходимости.

1

Рядом с ГОФ Command Pattern вы также можете посмотреть рисунок Transaction Script от P of EAA.

Возможно, вы должны создать композитную команду (или скрипт транзакции), которая выполняется последовательно.

2

Другим хорошим способом для отката/отмены является Memento Pattern. Обычно он используется для моментального снимка объекта в заданное время и позволяет вернуть состояние объекта в память.