Freigeben über


Gewusst wie: Verknüpfen von Modellaktualisierungen mithilfe von Transaktionen

Wenn Sie in Visual Studio Ultimate eine Erweiterung zu den UML-Designern definieren, können Sie mehrere Änderungen in einer einzelnen Transaktion gruppieren, die als verknüpfter Rückgängigkontext bezeichnet wird.

Standardmäßig kann jede Änderung, die der Code an einem Modell vornimmt, vom Benutzer einzeln rückgängig gemacht werden.Wenn Sie z. B. einen Menübefehl definieren, der die Namen von zwei UML-Klassen vertauscht, kann ein Benutzer den Befehl aufrufen und dann einen einzelnen Rückgängig-Vorgang ausführen.Dabei wird die Änderung eines Namens rückgängig gemacht, nicht jedoch die Änderung des anderen Namens, sodass sich das Modell dann in einem unbeabsichtigten Zustand befindet.

Um dies zu verhindern, kann der Code innerhalb einer Transaktion eine Reihe von Änderungen ausführen.Für die Benutzer sehen diese Änderungen dann wie eine einzelne Änderung aus.Wenn dann ein Rückgängig-Befehl ausgeführt wird, werden alle Änderungen rückgängig gemacht.

Ein zusätzlicher Vorteil besteht darin, dass der Code einen teilweise vollständigen Satz von Änderungen rückgängig machen kann, indem er eine Ausnahme auslöst oder die Transaktion abbricht.

So gruppieren Sie Änderungen in einer einzelnen Transaktion

Stellen Sie sicher, dass die Projektverweise diese .NET-Assembly enthalten:

Microsoft.VisualStudio.Modeling.Sdk.11.0.dll

Deklarieren Sie in der Klasse eine importierte Eigenschaft vom Typ ILinkedUndoContext:

using Microsoft.VisualStudio.Modeling.ExtensionEnablement;

...

class … {

[Import]

public ILinkedUndoContext LinkedUndoContext { get; set; }

Schließen Sie die Änderungen in einer Methode, die das Modell ändert, in eine Transaktion ein:

using (ILinkedUndoTransaction transaction =

LinkedUndoContext.BeginTransaction("my updates"))

{

// code to update model elements or shapes goes here

transaction.Commit();

}

Beachten Sie Folgendes:

  • Sie müssen am Ende der Transaktion immer Commit() einschließen.Wenn eine Transaktion verworfen wird, ohne übermittelt worden zu sein, wird die Transaktion zurückgesetzt.Das heißt, dass für das Modell der Zustand zu Beginn der Transaktion wiederhergestellt wird.

  • Wenn eine Ausnahme auftritt, die innerhalb der Transaktion nicht aufgefangen werden kann, wird die Transaktion zurückgesetzt.Es ist ein häufig verwendetes Muster, den using-Block der Transaktion in einen try…catch-Block einzuschließen.

  • Sie können Transaktionen verschachteln.

  • Sie können jeden nicht leeren Namen für BeginTransaction() bereitstellen.

  • Nur der UML-Modellspeicher ist von diesen Transaktionen betroffen.Modellerstellungstransaktionen wirken sich nicht auf folgende Elemente aus: Variablen, externe Speicher wie Dateien und Datenbanken, Ebenendiagramme, per Code generierte Sequenzdiagramme und Codemodelle.

 Beispiel

    using Microsoft.VisualStudio.Modeling.ExtensionEnablement;
    using Microsoft.VisualStudio.Uml.Interfaces;
    using Microsoft.VisualStudio.Uml.Classes;
    using Microsoft.VisualStudio.Uml.Extensions;
    using System.Linq;
    using System.ComponentModel.Composition;
 ...
  [Import]
  public ILinkedUndoContext LinkedUndoContext { get; set; }

  /// <summary>
  /// Swap the names of the currently selected elements.
  /// </summary>
  public void Execute(IMenuCommand command)
  {
    var selectedShapes =
      Context.CurrentDiagram.GetSelectedShapes<IClassifier>();
    if (selectedShapes.Count() < 2) return;
    IClassifier firstElement = selectedShapes.First().Element;
    IClassifier lastElement = selectedShapes.Last().Element;
    string firstName = firstElement.Name;
    // Perform changes inside a transaction so that undo
    // works as a single change.
    using (ILinkedUndoTransaction transaction = 
      LinkedUndoContext.BeginTransaction("Swap names"))
    {
        firstElement.Name = lastElement.Name;
        lastElement.Name = firstName;
        transaction.Commit();
    }
 }

Siehe auch

Konzepte

Programmieren mit der UML-API

Gewusst wie: Definieren eines Menübefehls in einem Modellierungsdiagramm

Erweitern von UML-Modellen und Diagrammen