Postupy: Propojení aktualizací modelů pomocí transakcí
Při definování rozšíření do návrhářů UML v aplikaci Visual Studio Ultimate můžete seskupit několik změn do jediné transakce s názvem kontext propojené funkce zpět.
Ve výchozím nastavení všechny změny, které provede v kódu modelu, mohou být samostatně anulovány uživatelem.Například pokud definujete příkaz nabídky, který zaměňuje názvy dvou tříd UML, uživatel může vyvolat příkaz a poté provést jedno vrácení zpět.To by vrátilo zpět změnu u jednoho názvu, ale nikoli u druhého, čímž zůstane váš model v nežádoucího stavu.
Chcete-li této situaci předejít, váš kód může provést řadu změn v rámci transakce.Díky tomu připadají uživateli změny jako jedna.Následný příkaz zrušení vrátí zpět celou řadu.
Další výhodou je, že váš kód může vrátit zpět částečně dokončené sady změn vyvoláním výjimky nebo přerušením transakce.
Seskupení změn do jedné transakce
Zajistěte, aby projekt Odkazy zahrnoval tento projekt sestavení .NET:
Microsoft.VisualStudio.Modeling.Sdk.12.0.dll
Uvnitř své třídy deklarujte importovanou vlastnost, která má typ ILinkedUndoContext:
using Microsoft.VisualStudio.Modeling.ExtensionEnablement;
...
class … {
[Import]
public ILinkedUndoContext LinkedUndoContext { get; set; }
V metodě, která 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();
}
Všimněte si následujícího:
Na konec transakce musíte vždy přidat Commit().Pokud je transakce vyřazena bez potvrzení, transakce bude vrácena zpět.To znamená, že model bude obnoven do stavu při zahájení transakce.
Pokud dojde k výjimce, která není zachycena uvnitř transakce, transakce bude vrácena zpět.Je časté uzavírat blok using transakce dovnitř bloku try…catch.
Můžete vnořovat transakce.
Můžete zadat libovolný neprázdný název do BeginTransaction().
Tyto transakce budou mít vliv pouze na úložiště modelu UML.Modelování transakci nemá vliv na: proměnné, externí úložiště, například soubory a databáze, diagramy vrstev, sekvenční diagramy generované z kódu ani modely kódu.
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í s rozhraním API UML