Substituir e estender as classes geradas

Sua Definição de DSL é uma plataforma na qual você pode compilar um conjunto poderoso de ferramentas baseadas em uma linguagem específica de domínio. Muitas extensões e adaptações podem ser feitas substituindo e estendendo as classes geradas a partir da Definição de DSL. Essas classes incluem não apenas as classes de domínio que você definiu explicitamente no diagrama de Definição de DSL, mas também outras classes que definem a caixa de ferramentas, o gerenciador, a serialização e assim por diante.

Mecanismos de extensibilidade

Vários mecanismos são fornecidos para permitir que você estenda o código gerado.

Substituir métodos em uma classe parcial

As definições de classe parcial permitem que uma classe seja definida em mais de um lugar. Isso permite separar o código gerado do código que você mesmo grava. Em seu código escrito manualmente, você pode substituir classes herdadas pelo código gerado.

Por exemplo, se na sua Definição de DSL você definir uma classe de domínio chamada Book, poderá gravar o código personalizado que adicione métodos de substituição:

public partial class Book
{
   protected override void OnDeleting()
   {
      MessageBox.Show("Deleting book " + this.Title);
      base.OnDeleting();
   }
}

Observação

Para substituir métodos em uma classe gerada, sempre grave seu código em um arquivo separado dos arquivos gerados. Normalmente, o arquivo está contido em uma pasta chamada CustomCode. Se você fizer alterações no código gerado, elas serão perdidas quando você regenerar o código a partir da Definição de DSL.

Para descobrir quais métodos você pode substituir, insira substituir na classe, seguido por um espaço. A dica de ferramenta do IntelliSense informará quais métodos podem ser substituídos.

Classes Derivadas Duplas

A maioria dos métodos em classes geradas é herdada de um conjunto fixo de classes nos namespaces Modelagem. No entanto, alguns métodos são definidos no código gerado. Normalmente, isso significa que você não pode substituí-los; não é possível substituir em uma classe parcial os métodos definidos em outra definição parcial da mesma classe.

No entanto, você pode substituir esses métodos definindo o sinalizador Gera Derivação Dupla para a classe de domínio. Isso faz com que duas classes sejam geradas, uma sendo uma classe base abstrata da outra. Todas as definições de método e de propriedade estão na classe base e apenas o construtor está na classe derivada.

Por exemplo, na amostra Library.dsl, a classe de domínio CirculationBook tem a propriedade Generates``Double Derived definida como true. O código gerado para essa classe de domínio contém duas classes:

  • CirculationBookBase, que é um abstrato e que contém todos os métodos e propriedades.

  • CirculationBook, que é derivada de CirculationBookBase. Ela está vazia, exceto por seus construtores.

Para substituir qualquer método, crie uma definição parcial da classe derivada, como CirculationBook. Você pode substituir os métodos gerados e os métodos herdados da estrutura de modelagem.

Você pode usar esse método com todos os tipos de elemento, incluindo elementos de modelo, relações, formas, diagramas e conectores. Você também pode substituir métodos de outras classes geradas. Algumas classes geradas, como a ToolboxHelper, sempre são derivações duplas.

Construtores personalizados

Não é possível substituir um construtor. Mesmo em classes derivadas duplas, o construtor deve estar na classe derivada.

Se você quiser fornecer seu próprio construtor, poderá fazer isso definindo Has Custom Constructor para a classe de domínio na Definição de DSL. Quando você clicar em Transformar Todos os Modelos, o código gerado não incluirá um construtor para essa classe. Ele incluirá uma chamada para o construtor ausente. Isso causa um relatório de erros quando você compila a solução. Clique duas vezes no relatório de erros para visualizar um comentário no código gerado que explique o que você deve fornecer.

Grave uma definição de classe parcial em um arquivo separado dos arquivos gerados e forneça o construtor.

Pontos de extensão sinalizados

Um ponto de extensão sinalizado é um local na Definição de DSL em que você pode definir uma propriedade ou uma caixa de seleção para indicar que você fornecerá um método personalizado. Construtores personalizados são um exemplo. Outros exemplos incluem definir o Kind de uma propriedade de domínio como Armazenamento Calculado ou Personalizado ou definir o sinalizador É Personalizado em um construtor de conexões.

Em cada caso, ao definir o sinalizador e regenerar o código, ocorrerá um erro de build. Clique duas vezes no erro para visualizar um comentário que explique o que você precisa fornecer.

Regras

O gerenciador de transação permite que você defina regras executadas antes do final de uma transação na qual ocorreu um evento designado, como uma alteração em uma propriedade. Normalmente, as regras são usadas para manter o sincronização entre elementos diferentes no repositório. Por exemplo, as regras são usadas para garantir que o diagrama exiba o estado atual do modelo.

As regras são definidas por classe, para que você não precise ter um código que registre a regra para cada objeto. Para obter mais informações, consulte Regras propagam alterações no modelo.

Eventos de repositório

O repositório de modelagem fornece um mecanismo de eventos que você pode usar para escutar tipos específicos de alteração no repositório, incluindo adição e exclusão de elementos, alterações nos valores de propriedade e assim por diante. Os manipuladores de eventos são chamados após o fechamento da transação na qual as alterações foram feitas. Normalmente, esses eventos são usados para atualizar recursos fora do repositório.

Eventos do .NET

Você pode assinar alguns eventos em formas. Por exemplo, você pode escutar cliques do mouse em uma forma. Você precisa gravar o código que assine o evento para cada objeto. Esse código pode ser escrito em uma substituição de InitializeInstanceResources().

Alguns eventos são gerados em ShapeFields, que são usados para desenhar decoradores em uma forma. Para obter um exemplo, consulte Como interceptar um clique em uma forma ou um decorador.

Esses eventos geralmente não ocorrem dentro de uma transação. Você deve criar uma transação se quiser fazer alterações no repositório.