Udostępnij za pośrednictwem


Jak: łącze Aktualizacje modelu przy użyciu transakcji

Po zdefiniowaniu rozszerzenie projektanci UML w Visual Studio Ultimate, można zgrupować kilka zmian w pojedynczą transakcję o nazwie połączone kontekst cofania.

Domyślnie każda zmiana, która sprawia, że Twój kod do modelu można oddzielnie cofnięte przez użytkownika.Na przykład w przypadku zdefiniowania polecenia menu, który zamienia nazwy dwóch klas UML, użytkownik może wywołać polecenie, a następnie wykonaj pojedynczego polecenia Cofnij.Byłoby to Cofnij Zmień jedną nazwę, ale nie drugiej, pozostawiając modelu w stanie niezamierzone.

Aby tego uniknąć, kodu można wykonać szereg zmian w obrębie transakcji.Dzięki temu zmiany, które wyglądają jak jedną zmianę do użytkownika.Polecenia Cofnij kolejnych cofnie całej serii.

Dodatkową korzyścią jest kodu można cofnąć częściowo ukończyć zestaw zmian przez zgłaszanie wyjątku lub przerywanie transakcji.

Do grupy zmian w pojedynczą transakcję

Upewnij się, że odwołania projektu zawierają tę.Montaż netto:

Microsoft.VisualStudio.Modeling.Sdk.11.0.dll

Wewnątrz klasy, należy zadeklarować przywożonych właściwość, która ma typ ILinkedUndoContext:

using Microsoft.VisualStudio.Modeling.ExtensionEnablement;

...

class … {

[Import]

public ILinkedUndoContext LinkedUndoContext { get; set; }

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

using (ILinkedUndoTransaction transaction =

LinkedUndoContext.BeginTransaction("my updates"))

{

// code to update model elements or shapes goes here

transaction.Commit();

}

Następujące powiadomienie:

  • Musi zawsze zawierać Commit() na końcu transakcji.Jeśli transakcja jest usuwane bez są zobowiązane, transakcja będzie być wycofana.Oznacza to, że model zostanie przywrócony do stanu w momencie rozpoczęcia transakcji.

  • Jeśli wystąpi wyjątek nie wychwycona wewnątrz transakcji, transakcji wycofuje.Jest częste deseń, należy ująć using transakcji wewnątrz bloku try…catch bloku.

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

  • Można podać dowolną nazwę niepustą do BeginTransaction().

  • Magazyn modelu UML ma wpływ tych transakcji.Transakcje modelowania nie wpływają na: zmienne, zewnętrznych magazynów, takich jak pliki i baz danych, diagramów warstwy sekwencji diagramy generowane na podstawie kodu i kodu modeli.

 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 przy użyciu interfejsu API UML

Jak: Definiowanie polecenia Menu na diagramie modelowania

Rozszerzanie modeli UML i diagramów