2008-08-22 23 views
5

Ich habe eine Notwendigkeit, einen „Transaktions“ Prozess mit einem externen API zu erstellen, die nicht COM + oder .NET-Transaktionen unterstützt (Sharepoint um genau zu sein)Transactional Design Muster

Was ich tun müssen, um in der Lage sein Führen Sie eine Reihe von Prozessen in einer Sequenz aus, aber jeder Fehler in dieser Sequenz bedeutet, dass ich alle vorherigen Schritte manuell rückgängig machen muss. In meinem Fall gibt es nur 2 Arten von Schritt, beide sind ziemlich einfach zu rückgängig zu machen.

Hat anyony irgendwelche Vorschläge für Designmuster oder Strukturen, die dafür nützlich sein könnten?

Antwort

3

Wenn Ihre Änderungen an der Sharepoint-Objektmodell fertig sind, können Sie die Tatsache nutzen, dass Änderungen nicht verpflichtet, bis Sie anrufen die Update() Methode des modifizierten Objekts, wie SPList.Update() oder SPWeb.Update().

Ansonsten würde ich das Command Design Pattern verwenden. Kapitel 6 in Head First Design Patterns enthält sogar ein Beispiel, das die Undo-Funktionalität implementiert.

3

Das GoF-Befehlsmuster unterstützt nicht rückgängig zu machende Operationen.

Ich denke, das gleiche Muster kann für sequentielle Operationen (sequentielle Befehle) verwendet werden.

0

Wenn Sie C++ (oder eine andere Sprache mit deterministischer Destruktorausführung, wenn Bereiche enden) verwenden, können Sie sich Scope Guards ansehen. Diese Technik kann wahrscheinlich auch an .NET angepasst werden, indem ScopeGuard IDisposable implementiert und "using" -Anweisungen wie benötigt streut.

1

Neben der GOF Command Pattern möchten Sie vielleicht auch die Transaction Script Muster von P of EAA.

Sie sollten wahrscheinlich einen zusammengesetzten Befehl (oder Transaction Script) erstellen, der nacheinander ausgeführt wird.

2

Eine andere gute Möglichkeit für Rollback/Undo ist die Memento Pattern. Es wird normalerweise verwendet, um eine Momentaufnahme des Objekts zu einer bestimmten Zeit zu machen und das Objekt zum Memento zurückkehren zu lassen.