Condividi tramite


Procedura: collegare aggiornamenti di modelli tramite transazioni

Quando si definisce un'estensione nelle finestre di progettazione UML di Visual Studio Ultimate, è possibile raggruppare diverse modifiche in una singola transazione denominata contesto di annullamento collegato.

Per impostazione predefinita, ogni modifica apportata dal codice a un modello può essere annullata separatamente dall'utente. Se ad esempio si definisce un comando di menu che scambia i nomi di due classi UML, un utente può richiamare il comando e quindi eseguire un singolo annullamento. In questo modo, viene però annullata la modifica apportata a un solo nome, e non all'altro, lasciando il modello in uno stato imprevisto.

Per evitare questo problema, il codice può eseguire una serie di modifiche all'interno di una transazione, che all'utente appariranno però come un'unica modifica. Un successivo comando di annullamento annullerà l'intera serie.

Un vantaggio aggiuntivo consiste nel fatto che il codice può annullare un set di modifiche parzialmente-completo generando un'eccezione o interrompendo la transazione.

Raggruppare le modifiche in una singola transazione

Assicurarsi che i riferimenti al progetto includano questo assembly .NET:

Microsoft.VisualStudio.Modeling.Sdk.12.0.dll

Dichiarare all'interno della classe una proprietà importata con il tipo ILinkedUndoContext:

using Microsoft.VisualStudio.Modeling.ExtensionEnablement;

...

class … {

[Import]

public ILinkedUndoContext LinkedUndoContext { get; set; }

In un metodo che modifica il modello includere le modifiche in una transazione:

using (ILinkedUndoTransaction transaction =

LinkedUndoContext.BeginTransaction("my updates"))

{

// code to update model elements or shapes goes here

transaction.Commit();

}

Tenere presente quanto segue:

  • È necessario includere sempre Commit() alla fine della transazione. Se una transazione viene eliminata senza eseguirne il commit, verrà eseguito il rollback della transazione, ovvero verrà ripristinato lo stato del modello all'inizio della transazione.

  • Se si verifica un'eccezione che non viene intercettata nella transazione, verrà eseguito il rollback della transazione. Un modello frequente prevede di includere il blocco using della transazione nel blocco try…catch.

  • È possibile annidare le transazioni.

  • È possibile specificare qualsiasi nome non vuoto per BeginTransaction().

  • Solo l'archivio modelli UML è interessato da tali transazioni. Le transazioni di modellazione non influiscono su variabili, archivi esterni come file e database, diagrammi livello, diagrammi di sequenza generati dal codice e modelli di codice.

 Esempio

    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();
    }
 }

Vedere anche

Concetti

Programmazione con l'API UML

Procedura: definire un comando di menu in un diagramma di modellazione

Estensione di modelli e diagrammi UML