Compartilhar via


Como: Atualizações do modelo de link usando transações

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

Por padrão, cada modificação que torna o seu código para um modelo pode ser desfeita separadamente pelo usuário. Por exemplo, se você definir um comando de menu troca os nomes das duas classes UML, um usuário poderia chamar o comando e, em seguida, execute um desfazer. Isso seria desfazer a alteração de um nome, mas não no outro, deixando o seu modelo em um estado não intencional.

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ça com uma única alteração para o usuário. Um comando Desfazer subseqüente irá desfazer a série toda.

Um benefício adicional é que seu código pode desfazer um conjunto parcialmente completa de alterações por lançar uma exceção ou anular a transação.

As alterações de grupo em uma única transação.

Verifique as referências do projeto incluem-lo.NET assembly:

Microsoft.VisualStudio.Modeling.Sdk.10.0.dll

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

using Microsoft.VisualStudio.Modeling.ExtensionEnablement;

...

class … {

[Import]

public ILinkedUndoContext LinkedUndoContext { get; set; }

Em um método que modifica o modelo, coloque as 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ê deve incluir sempre Commit() no final da transação. Se uma transação é descartada sem serem confirmadas, a transação será revertida. Ou seja, o modelo será restaurado ao estado no início da transação.

  • Se ocorrer uma exceção não é detectada dentro da transação, a transação será revertida. É um padrão freqüente para delimitar o using bloco da transação dentro de um try…catch bloco.

  • Você pode aninhar transações.

  • Você pode fornecer qualquer nome espaço em branco para BeginTransaction().

  • Somente o armazenamento de modelo UML é afetado por essas transações. Transações de modelagem não afetam: variáveis de armazenamentos externos como, por exemplo, arquivos e bancos de dados, diagramas, diagramas de seqüência gerados a partir do código e modelos de código de camada.

 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

Programação com a API de UML

Como: Definir um comando de Menu em um diagrama de modelagem

Diagramas e modelos UML estendendo