Substituindo e estendendo as Classes geradas
A definição de DSL é uma plataforma na qual você pode criar um conjunto poderoso de ferramentas que se baseiam em uma linguagem específica de domínio.Muitas extensões e adaptações podem ser feitas, substituindo e estendendo as classes que são 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, explorer, serialização e assim por diante.
Mecanismos de extensibilidade
Vários mecanismos são fornecidos para permitir que você amplie o código gerado.
Substituindo os métodos em uma classe parcial
Definições de classe parcial permitem uma classe para ser definido em mais de um lugar.Isso permite que você separe o código gerado do código que você mesmo escreva.No seu código escrito manualmente, você pode substituir as classes herdadas por código gerado.
Por exemplo, se em sua definição de DSL, você define uma classe de domínio chamada Book, você poderia escrever código personalizado que adiciona os 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 os métodos em uma classe gerada, sempre escreva seu código em um arquivo separado de 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ê gerar novamente o código a partir da definição de DSL. |
Para descobrir quais você pode substituir os métodos, o tipo de substituir na classe, seguida por um espaço.A dica de ferramenta de IntelliSense você saberá quais métodos podem ser substituídos.
Classes derivadas de duplo
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; Você não pode substituir em uma classe parcial os métodos que são definidos em outra definição parcial da mesma classe.
No entanto, você pode substituir esses métodos, definindo a Gera Double derivado sinalizador para a classe de domínio.Este faz com que duas classes a serem gerados, sendo uma classe base abstrata da outra.Todas as definições de método e propriedade são na classe base, e somente o construtor é na classe derivada.
Por exemplo, no exemplo Library.dsl, o CirculationBook a classe de domínio tem a GeneratesDouble Derived propriedade definida como true.O código gerado para essa classe de domínio contém duas classes:
CirculationBookBase, que é um resumo e que contém os métodos e propriedades.
CirculationBook, que é derivada de CirculationBookBase.Ela está vazia, exceto para seus construtores.
Para substituir qualquer método, você cria 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 as relações, conectores, formas, diagramas e elementos de modelo.Você também pode substituir os métodos de outras classes geradas.Algumas classes geradas, como o ToolboxHelper sempre são derivados de duplo.
Construtores personalizados
Você não pode substituir um construtor.Mesmo em classes derivadas de duplo, o construtor deve ser na classe derivada.
Se você desejar fornecer seu próprio construtor, você pode fazer isso, definindo Has Custom Constructor para a classe de domínio na definição de DSL.Quando você clica em Transformar todos os modelos de, o código gerado não incluirá um construtor para essa classe.Ela incluirá uma chamada ao construtor ausente.Isso faz com que um relatório de erro quando você constrói a solução.Clique duas vezes para ver um comentário no código gerado que explica o que você deve fornecer o relatório de erros.
Escrever uma definição de classe parcial em um arquivo separado do que os arquivos gerados e fornecer um construtor.
Pontos de extensão sinalizadas
Um ponto de extensão com sinalizadores é um local na definição de DSL, onde é possível 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 a configuração do Kind de uma propriedade de domínio para calculado ou armazenamento personalizado ou configuração o Personalizada É sinalizador em um construtor de conexão.
Em cada caso, quando você define o sinalizador e regenera o código, isso resultará um erro de compilação.Clique duas vezes para ver um comentário explicando o que você precisa fornecer o erro.
Regras
O Gerenciador de transações permite que você defina regras que são executados antes do final de uma transação na qual designado Ocorreu um evento, como, por exemplo, uma alteração em uma propriedade.Regras são normalmente usadas para manter a synchronism entre diferentes elementos no armazenamento.Por exemplo, as regras são usadas para certificar-se de que o diagrama mostra o estado atual do modelo.
As regras são definidas em uma base de classe, para que você não é necessário ter o código que registra a regra para cada objeto.Para obter mais informações, consulte Regras de propagam alterações dentro do modelo.
Eventos de armazenamento
O armazenamento de modelagem fornece um mecanismo de eventos que você pode usar para ouvir para tipos específicos de alteração no armazenamento, incluindo a 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 encerramento da transação na qual as alterações foram feitas.Normalmente, esses eventos são usados para atualizar recursos fora do armazenamento.
.NET completos
Você pode assinar alguns eventos nas formas.Por exemplo, você pode ouvir cliques do mouse em uma forma.Você precisa escrever código que assina o evento para cada objeto.Esse código pode ser gravado em uma substituição do InitializeInstanceResources().
Alguns eventos são gerados nos ShapeFields, que são usadas para desenhar os decoradores em uma forma.Para um exemplo, consulte Como: interceptar um clique em uma forma ou a decorador.
Esses eventos geralmente não ocorrem dentro de uma transação.Se você desejar fazer alterações no armazenamento, você deve criar uma transação.