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