Udostępnij za pośrednictwem


Porady: łączenie aktualizacji modeli za pomocą transakcji

Po zdefiniowaniu rozszerzenia projektantów UML w Visual Studio Ultimate, można zgrupować kilka zmian w pojedynczą transakcję o nazwie kontekst połączonego cofania.

Domyślnie każda modyfikacja modelu kodem może zostać oddzielnie cofnięta przez użytkownika.Na przykład, jeśli zdefiniujesz polecenie menu, które zamienia nazwy dwóch klas UML, użytkownik może wywołać polecenie, a następnie wykonać pojedynczą czynność cofnięcia.Czy to cofnie zmianę do jednej nazwy, ale nie drugiej, pozostawiając twój model w niezamierzonym stanie.

Aby tego uniknąć, kod może wykonać szereg zmian w obrębie transakcji.To sprawia, że zmiany wyglądają jak jedna zmiana dla użytkownika.Kolejne polecenie cofnięcia spowoduje cofnięcie całej serii.

Dodatkową zaletą jest to, że kod może cofnąć częściowo wypełnione zestawy zmian przez wyrzucanie wyjątku lub przerywanie transakcji.

Aby pogrupować zmiany w pojedynczą transakcję

Upewnij się, że odwołania projektu obejmują ten zestaw .NET:

Microsoft.VisualStudio.Modeling.Sdk.12.0.dll

Wewnątrz klasy, należy zadeklarować zaimportowaną właściwość typu ILinkedUndoContext:

using Microsoft.VisualStudio.Modeling.ExtensionEnablement;

...

class … {

[Import]

public ILinkedUndoContext LinkedUndoContext { get; set; }

W metodzie, która modyfikuje model, należy ująć zmiany w transakcji:

using (ILinkedUndoTransaction transaction =

LinkedUndoContext.BeginTransaction("my updates"))

{

// code to update model elements or shapes goes here

transaction.Commit();

}

Zauważ, co następuje:

  • Nie musisz zawsze dołączać Commit() na końcu transakcji.Jeśli transakcja jest usuwana bez zatwierdzenia, transakcja zostanie wycofana.Oznacza to, że model zostanie przywrócony do jego stanu na początku transakcji.

  • Jeśli wystąpi wyjątek, który nie jest wyłapywany wewnątrz transakcji, transakcja zostanie wycofana.To częsty wzór, aby załączyć blok using transakcji wewnątrz bloku try…catch.

  • Transakcje można zagnieżdżać.

  • Możesz podać dowolną nazwę, która nie jest pusta do BeginTransaction().

  • Magazyn modeli UML ma wpływ tych transakcje.Nie wpływają na transakcje modelowania: zmienne, zewnętrzne magazyny takie jak pliki i bazy danych, diagramy warstwowe, diagramy sekwencji wygenerowane z kodu i modeli kodów.

 Przykład

    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();
    }
 }

Zobacz też

Koncepcje

Programowanie za pomocą API UML

Porady: definiowanie polecenia menu na diagramie modelowania

Rozszerzanie diagramów i modeli UML