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