Partilhar via


Como vincular atualizações de modelo usando transações

Quando você define uma extensão para os designers de UML em Visual Studio Ultimate, pode agrupar várias alterações em uma única transação chamada contexto de desfazer associado.

Por padrão, cada modificação que seu código faz em um modelo, pode ser desfeita separadamente pelo usuário. Por exemplo, se você definir um comando de menu que alterna os nomes das duas classes de UML, um usuário pode invocar o comando e, em seguida, executar uma única operação "undo" (desfazer). Isso desfaria a alteração em um nome, mas não em outro, deixando seu modelo em um estado não pretendido.

Para evitar isso, seu código pode executar uma série de alterações em uma transação. Isso faz com que as alterações pareçam uma única alteração para o usuário. Um comando subsequente desfazer desfazerá a série inteira.

Um benefício adicional é que seu código pode desfazer um conjunto de alterações parcial/completamente lançando uma exceção ou anulando a transação.

Para agrupar alterações em uma única transação

Certifique-se de que as referências do projeto incluam esse assembly. NET:

Microsoft.VisualStudio.Modeling.Sdk.12.0.dll

Dentro de sua classe, declare uma propriedade importada que tem o tipo ILinkedUndoContext:

using Microsoft.VisualStudio.Modeling.ExtensionEnablement;

...

class … {

[Import]

public ILinkedUndoContext LinkedUndoContext { get; set; }

Em um método que altera o modelo, inclua suas alterações em uma transação:

using (ILinkedUndoTransaction transaction =

LinkedUndoContext.BeginTransaction("my updates"))

{

// code to update model elements or shapes goes here

transaction.Commit();

}

Observe o seguinte:

  • Você sempre deve incluir Commit() no final da transação. Se uma transação for descartada sem ser confirmada, a transação será revertida. Isto é, o modelo será restaurado ao seu estado no início da transação.

  • Se ocorrer uma exceção que não é capturada dentro da transação, a transação será revertida. É um padrão frequente para incluir o bloco de using de transação dentro de um bloco de try…catch.

  • Você pode aninhar transações.

  • Você pode fornecer qualquer nome não em branco para BeginTransaction().

  • Somente o repositório de modelos de UML é afetado por essas transações. A modelagem de transações não afeta: variáveis, armazenamentos externos como arquivos e bancos de dados, diagramas de camada, diagramas de sequência gerados por código, e modelos de código.

 Exemplo

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

Consulte também

Conceitos

Programando com a API UML

Como definir um comando de menu em um diagrama de modelagem

Estendendo modelos e diagramas UML