2008-08-22 29 views
5

Tengo una necesidad de crear un proceso de "transaccional" mediante una API externa que no admite transacciones COM + o .NET (Sharepoint, para ser exactos)transaccional de patrones de diseño

Lo que necesito hacer es ser capaz de realizar una serie de procesos en una secuencia, pero cualquier falla en esa secuencia significa que tendré que deshacer manualmente todos los pasos anteriores. En mi caso, solo hay 2 tipos de pasos, ambos af que son bastante fáciles de deshacer/revertir.

¿Anyony tiene alguna sugerencia para los patrones de diseño o las estructuras que podrían ser útiles para esto?

Respuesta

3

Si los cambios se realizan para el modelo de objetos de SharePoint, puede utilizar el hecho de que los cambios no se han comprometido hasta que llame el método Update() del objeto modificado, como SPList.Update() o SPWeb.Update().

De lo contrario, utilizaría el Comando Diseño de patrón. El Capítulo 6 en Head First Design Patterns incluso tiene un ejemplo que implementa la funcionalidad de deshacer.

3

El patrón de comando GoF admite operaciones que se pueden deshacer.

Creo que el mismo patrón se puede usar para operaciones secuenciales (comandos secuenciales).

0

Si está utilizando C++ (o cualquier otro lenguaje con ejecución determinista de destructor cuando finaliza el alcance) puede echar un vistazo a Scope Guards. Esta técnica probablemente también se puede adaptar a .NET haciendo que ScopeGuard implemente IDisposable y rocíe declaraciones de "uso" según sea necesario.

1

Al lado del GOF Command Pattern es posible que también desee echarle un vistazo al patrón Transaction Script de P of EAA.

Probablemente deberías crear un Comando compuesto (o Script de transacción) que se ejecuta en secuencia.

2

Otra buena forma de deshacer/deshacer es Memento Pattern. Por lo general, se utiliza para tomar una instantánea del objeto en un momento dado y permite que el estado del objeto se revierte al recuerdo.