Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Esta seção mostra como usar o código personalizado para acessar, modificar ou criar um modelo em uma linguagem específica do domínio (DSL).
Contexto para escrever código para uma DSL
Há vários contextos nos quais você pode escrever código que funciona com uma DSL:
Comandos personalizados. Você pode criar um comando que os usuários podem invocar clicando com o botão direito do mouse no diagrama e que pode modificar o modelo. Para obter mais informações, consulte Como adicionar um comando ao menu de atalho.
Validação. Você pode escrever código que verifica se o modelo está em um estado correto. Para obter mais informações, consulte Validação em um idioma Domain-Specific.
Sobrepondo o comportamento padrão. Você pode modificar muitos aspetos do código que é gerado a partir de DslDefinition.dsl. Para obter mais informações, consulte Substituindo e estendendo as classes geradas.
Transformação de texto. Você pode escrever modelos de texto que contêm código que acessa um modelo e gera um arquivo de texto, por exemplo, para gerar código de programa. Para obter mais informações, consulte Gerando código a partir de uma linguagem Domain-Specific.
Outras extensões do Visual Studio. Você pode escrever extensões VSIX separadas que leem e modificam modelos. Para obter mais informações, consulte Como abrir um modelo a partir de arquivo no código de programa
Loja In-Memory
As instâncias das classes definidas em DslDefinition.dsl são mantidas em uma estrutura de dados chamada IMS (In-Memory Store ) ou Store. As classes que você define em uma DSL sempre tomam um Store como um argumento para o construtor. Por exemplo, se sua DSL define uma classe chamada Example:
Example element = new Example (theStore);
Manter objetos na Loja, em vez de apenas como objetos comuns, oferece vários benefícios.
transações. Você pode agrupar uma série de alterações relacionadas em uma transação:
using (Transaction t = store.TransactionManager.BeginTransaction("updates")) { // make several changes to Store elements here t.Commit(); }Se ocorrer uma exceção durante as alterações e a ação final
Commit()não for executada, o armazenamento será redefinido para o estado anterior. Essa abordagem ajuda você a garantir que os erros não deixem o modelo em um estado inconsistente. Para obter mais informações, consulte Navegando e atualizando um modelo no código do programa.Relações binárias. Se você definir uma relação entre duas classes, as instâncias em ambas as extremidades terão uma propriedade que navega até a outra extremidade. As duas pontas estão sempre sincronizadas. Por exemplo, se você definir uma relação de paternidade com funções chamadas Pais e Filhos, poderá escrever:
John.Children.Add(Mary)Ambas as expressões a seguir agora são verdadeiras:
John.Children.Contains(Mary)Mary.Parents.Contains(John)Você também pode obter o mesmo efeito escrevendo:
Mary.Parents.Add(John)Para obter mais informações, consulte Navegando e atualizando um modelo no código do programa.
Regras e Eventos. Você pode definir regras que são acionadas sempre que alterações especificadas são feitas. As regras são usadas, por exemplo, para manter as formas no diagrama atualizadas com os elementos do modelo que apresentam. Para obter mais informações, consulte Respondendo e propagando alterações.
Serialização. A Loja fornece uma maneira padrão de serializar os objetos que contém em um arquivo. Você pode personalizar as regras para serialização e desserialização. Para obter mais informações, consulte Personalizando o armazenamento de arquivos e a serialização XML.