Pregunta

Necesito crear un proceso "transaccional" utilizando una API externa que no admita transacciones COM+ o .NET (Sharepoint para ser exactos)

Lo que necesito hacer es poder realizar una cantidad 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 son bastante fáciles de deshacer/revertir.

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

¿Fue útil?

Solución

Si sus cambios se realizan en el modelo de objetos de SharePoint, puede aprovechar el hecho de que los cambios no se confirman hasta que llame al Update() método del objeto modificado, como SPList.Update() o SPWeb.Update().

De lo contrario, usaría el Dominio Patrón de diseño.Capítulo 6 en Primero los patrones de diseño Incluso tiene un ejemplo que implementa la funcionalidad de deshacer.

Otros consejos

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

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

Otra buena forma de revertir/deshacer es Patrón de recuerdo.Por lo general, se usa para tomar una instantánea del objeto en un momento dado y dejar que el estado del objeto vuelva al recuerdo.

Al lado del GOF Patrón de comando es posible que también quieras echar un vistazo a Guión de transacción patrón de P de EAA.

Probablemente debería crear un comando compuesto (o script de transacción) que se ejecute en secuencia.

Es posible que desee echar un vistazo al Administrador de recursos de compensación:

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

Si está utilizando C++ (o cualquier otro lenguaje con ejecución determinista del destructor cuando finalizan los alcances), puede echar un vistazo a Guardias de alcance.Esta técnica probablemente también pueda adaptarse a .NET haciendo que ScopeGuard implemente IDisposable y agregando declaraciones "using" según sea necesario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top