Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
A definição da sua DSL é uma plataforma na qual é possível construir um poderoso conjunto de ferramentas baseadas em uma linguagem específica do 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 DSL. Essas classes incluem não apenas as classes de domínio que você definiu explicitamente no diagrama de definição DSL, mas também outras classes que definem a caixa de ferramentas, explorador, 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 parciais de classe permitem que uma classe seja definida em mais de um lugar. Isso permite que você separe o código gerado do código que você mesmo escreve. Em seu código escrito manualmente, você pode substituir classes herdadas pelo código gerado.
Por exemplo, se em sua definição DSL você definir uma classe de domínio chamada Book, você pode escrever código personalizado que adiciona 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 escreva 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 da Definição DSL.
Para descobrir quais métodos você pode substituir, digite substituir na classe, seguido por um espaço. A dica de ferramenta do IntelliSense informará quais métodos podem ser substituídos.
Classes Dupla-Derivadas
A maioria dos métodos nas classes geradas são herdadas 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 que são definidos em outra definição parcial da mesma classe.
No entanto, você pode substituir esses métodos definindo o sinalizador Gera derivada dupla para a classe de domínio. Isso faz com que duas classes sejam geradas, sendo uma uma classe base abstrata da outra. Todas as definições de método e propriedade estão na classe base, e apenas o construtor está na classe derivada.
Por exemplo, no exemplo Library.dsl, a CirculationBook classe de domínio tem a Generates``Double 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 todos os métodos e propriedades.CirculationBook, que deriva deCirculationBookBase. Ele está vazio, exceto para 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, relacionamentos, formas, diagramas e conectores. Você também pode substituir métodos de outras classes geradas. Algumas classes geradas, como o ToolboxHelper, são sempre derivadas duplamente.
Construtores personalizados
Não é possível substituir um construtor. Mesmo em classes duplamente derivadas, o construtor deve estar na classe derivada.
Se você quiser fornecer seu próprio construtor, você pode fazer isso definindo Has Custom Constructor para a classe de domínio na definição DSL. Quando você clica 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 erro quando você cria a solução. Clique duas vezes no relatório de erros para ver um comentário no código gerado que explica o que você deve fornecer.
Escreva 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 DSL onde você pode definir uma propriedade ou uma caixa de seleção para indicar que você fornecerá um método personalizado. Os construtores personalizados são um exemplo. Outros exemplos incluem definir a Kind propriedade de um domínio como Armazenamento Calculado ou Personalizado ou definir o sinalizador É Personalizado em um construtor de conexões.
Em cada caso, quando você define o sinalizador e regenera o código, um erro de compilação resultará. Clique duas vezes no erro para ver um comentário que explica o que você precisa fornecer.
Regras
O gerenciador de transações permite definir regras que são executadas antes do final de uma transação na qual ocorreu um evento designado, como uma alteração em uma propriedade. As regras são normalmente usadas para manter o sincronismo entre diferentes elementos na loja. 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 dentro do modelo.
Eventos da Loja
O repositório de modelagem fornece um mecanismo de eventos que se pode usar para monitorizar tipos específicos de mudanças no repositório, incluindo a adição e eliminação de elementos, alterações nos valores de propriedade, entre outros. 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 da loja.
Eventos .NET
Pode subscrever alguns eventos relativos a formas. Por exemplo, você pode ouvir cliques do mouse em uma forma. Você tem que escrever o código que se inscreve no 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 numa forma ou decorador.
Esses eventos geralmente não ocorrem dentro de uma transação. Você deve criar uma transação se quiser fazer alterações na loja.