Jak: aktualizace modelu odkaz pomocí transakcí
Při definování rozšíření UML návrháři v Visual Studio Ultimate, můžete seskupit několik změn do jedné transakce se nazývá propojené kontextu funkce zpět.
Ve výchozím nastavení všechny změny, které provede kód v modelu lze je vrátit samostatně zpět uživateli.Například jestliže příkaz nabídky, který zaměňuje názvy dvou tříd UML, uživatel může vyvolat příkaz a proveďte jeden zpět.To by vrátit zpět změnu jeden název, ale ne na druhou, opuštění modelu nezamýšleným státu.
Zabránit, můžete provést kód řadu změn v rámci transakce.Díky změny vypadat jednu změnu uživateli.Příkaz následné zpět zpět celou řadu.
Další výhodou je, že kódu můžete vrátit zpět částečně dokončení sady změn došlo k výjimce nebo přerušení transakce.
Změny skupiny do jediné transakce
Zkontrolujte že odkazy projektu zahrnují.NET sestavení:
Microsoft.VisualStudio.Modeling.Sdk.11.0.dll
Uvnitř vaší třídy deklarujete dováženého majetku, který je typu ILinkedUndoContext:
using Microsoft.VisualStudio.Modeling.ExtensionEnablement;
...
class … {
[Import]
public ILinkedUndoContext LinkedUndoContext { get; set; }
V metodě upravuje model uzavřete změny v transakci:
using (ILinkedUndoTransaction transaction =
LinkedUndoContext.BeginTransaction("my updates"))
{
// code to update model elements or shapes goes here
transaction.Commit();
}
Následující oznámení:
Musí vždy obsahovat Commit() na konci transakce.Pokud je transakce vyřazen bez potvrzení, transakce bude vrácena zpět.Model, bude obnoven do stavu při zahájení transakce.
Pokud dojde k výjimce není zachycené uvnitř transakce, transakce bude vrácena zpět.Je časté vzorek uvádějte using transakce uvnitř bloku try…catch bloku.
Vnoření transakce.
Můžete zadat libovolný prázdný název na BeginTransaction().
Tyto transakce bude mít vliv pouze v úložišti modelu UML.Modelování transakce neovlivní: proměnné, externí úložiště například souborů a databází, diagramy vrstvy, číselné řady diagramů z kódu a kód modely.
Příklad
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();
}
}
Viz také
Koncepty
Programování v rozhraní API UML