Шаблон транзакционного дизайна - PullRequest
5 голосов
/ 22 августа 2008

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

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

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

Ответы [ 6 ]

3 голосов
/ 22 августа 2008

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

В противном случае я бы использовал Command Design Pattern. Глава 6 в Шаблоны проектирования Head First даже содержит пример, который реализует функцию отмены.

3 голосов
/ 22 августа 2008

Шаблон команд GoF поддерживает отмену операций.

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

2 голосов
/ 28 августа 2008

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

1 голос
/ 22 августа 2008

Рядом с шаблоном команды GOF вы также можете взглянуть на шаблон Сценарий транзакции из P EAA .

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

0 голосов
/ 22 августа 2008

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

0 голосов
/ 22 августа 2008

Возможно, вы захотите взглянуть на Compensating Resource Manager:

http://msdn.microsoft.com/en-us/library/8xkdw05k(VS.80).aspx

...