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.
Este tópico explica os conceitos básicos na definição e uso de uma linguagem específica de domínio (DSL) criada com o SDK de modelagem para Visual Studio.
Observação
O SDK de transformação de modelo de texto e o SDK de modelagem do Visual Studio são instalados automaticamente quando você instala recursos específicos do Visual Studio. Para obter mais detalhes, consulte esta postagem no blog.
Se você é novo em DSLs, recomendamos que você trabalhe através do DSL Tools Lab, que você pode encontrar neste site: SDK de visualização e modelagem
O que você pode fazer com um Domain-Specific Language?
Uma linguagem específica de domínio é uma notação, geralmente gráfica, que é projetada para ser usada para uma finalidade específica. Por outro lado, linguagens como UML são de uso geral. Em uma DSL, você pode definir os tipos de elemento de modelo e suas relações, e como eles são apresentados na tela.
Quando você tiver projetado uma DSL, poderá distribuí-la como parte de um pacote VSIX (Visual Studio Integration Extension). Os usuários trabalham com a DSL no Visual Studio:
A notação é apenas uma parte de uma DSL. Juntamente com a notação, seu pacote VSIX inclui ferramentas que os usuários podem aplicar para ajudá-los a editar e gerar material de seus modelos.
Uma das principais aplicações das DSLs é gerar código de programa, arquivos de configuração e outros artefatos. Especialmente em grandes projetos e linhas de produtos, onde várias variantes de um produto serão criadas, gerar muitos dos aspetos variáveis de DSLs pode fornecer um grande aumento na confiabilidade e uma resposta muito rápida às mudanças de requisitos.
O restante desta visão geral é um passo a passo que apresenta as operações básicas de criação e uso de uma linguagem específica de domínio no Visual Studio.
Pré-requisitos
Para definir uma DSL, você deve ter instalado os seguintes componentes:
| Componente | Link |
|---|---|
| Visual Studio | http://go.microsoft.com/fwlink/?LinkId=185579 |
| Visual Studio SDK | https://go.microsoft.com/fwlink/?linkid=2166172 |
| SDK de modelagem para Visual Studio |
Observação
O componente Transformação de modelo de texto é instalado automaticamente como parte da carga de trabalho de desenvolvimento de extensão do Visual Studio . Você também pode instalá-lo na guia Componentes individuais do Visual Studio Installer, na categoria SDKs, bibliotecas e estruturas . Instale o componente SDK de modelagem na guia Componentes individuais .
Criar uma solução DSL
Para criar uma nova linguagem específica do domínio, crie uma nova solução do Visual Studio usando o modelo de projeto Domain-Specific Language.
No menu Arquivo , aponte para Novo e clique em Projeto.
Em Tipos de projeto, expanda o nó Outros tipos de projeto e clique em Extensibilidade.
Clique em Domain-Specific Language Designer.
Na caixa Nome , digite Árvore Genealógica. Clique em OK.
O Assistente de Linguagem Específica do Domínio abre-se e apresenta uma lista de soluções modelo de DSL.
Clique em cada modelo para ver uma descrição,
Os modelos são pontos de partida úteis. Cada um deles fornece uma DSL de trabalho completa, que pode ser editada para atender às suas necessidades. Normalmente, você escolheria o modelo mais próximo do que deseja criar.
Para este passo a passo, escolha o modelo Linguagem mínima .
Insira uma extensão de nome de arquivo para sua DSL na página do assistente apropriada. Esta é a extensão que os ficheiros que contêm instâncias da sua DSL irão usar.
Escolha uma extensão que não esteja associada a qualquer aplicação no seu computador ou em qualquer computador onde pretenda instalar a DSL. Por exemplo, docx e htm seriam extensões de nome de arquivo inaceitáveis.
O assistente avisará se a extensão que o utilizador inseriu estiver a ser usada como DSL. Considere o uso de uma extensão de nome de arquivo diferente. Você também pode redefinir a instância experimental do SDK do Visual Studio para limpar designers experimentais antigos. No menu Iniciar do Windows, digite redefinir o Visual Studio e execute o comando Redefinir a Instância Experimental do Microsoft Visual Studio correspondente à sua versão do Visual Studio.
Inspecione as outras páginas e clique em Concluir.
É gerada uma solução que contém dois projetos. Eles são chamados de Dsl e DslPackage. É aberto um arquivo de diagrama chamado DslDefinition.dsl.
Observação
A maioria do código que você pode ver nas pastas nos dois projetos é gerada a partir de DslDefinition.dsl. Por esta razão, a maioria das modificações ao seu DSL são feitas neste arquivo.
A interface do usuário agora se assemelha à imagem a seguir.
Esta solução define uma linguagem específica do domínio. Para obter mais informações, consulte Visão geral da interface do usuário das ferramentas de idioma Domain-Specific.
As partes importantes da solução DSL
Observe os seguintes aspetos da nova solução:
Dsl\DslDefinition.dsl Este é o arquivo que você vê quando cria uma solução DSL. Quase todo o código na solução é gerado a partir desse arquivo, e a maioria das alterações que você faz em uma definição DSL são feitas aqui. Para obter mais informações, consulte Trabalhando com o diagrama de definição DSL.
Projeto Dsl Este projeto contém código que define a linguagem específica do domínio.
Projeto DslPackage Este projeto contém código que permite que instâncias da DSL sejam abertas e editadas no Visual Studio.
Executando a DSL
Você pode executar a solução DSL assim que a criou. Mais tarde, você pode modificar a definição de DSL gradualmente, executando a solução novamente após cada alteração.
Para experimentar com a DSL
Clique em Transformar Todos os Modelos na barra de ferramentas Gerenciador de Soluções. Isso regenera a maior parte do código-fonte de DslDefinition.dsl.
Observação
Sempre que você alterar DslDefinition.dsl, você deve clicar em Transformar todos os modelos antes de reconstruir a solução. Você pode automatizar esta etapa. Para obter mais informações, consulte Como automatizar a transformação de todos os modelos.
Pressione F5 ou, no menu Depurar , clique em Iniciar Depuração.
O DSL compila e é instalado na instância experimental do Visual Studio.
Uma instância experimental do Visual Studio é iniciada. A instância experimental obtém suas configurações de uma subárvore separada do registro, onde as extensões do Visual Studio são registradas para fins de depuração. Instâncias normais do Visual Studio não têm acesso a extensões registradas lá.
Na instância experimental do Visual Studio, abra o arquivo de modelo chamado Test from Solution Explorer.
- ou -
Clique com o botão direito do mouse no projeto de Depuração, aponte para Adicionar e clique em Item. Na caixa de diálogo Adicionar Item , selecione o tipo de arquivo da sua DSL.
O arquivo de modelo é aberto como um diagrama em branco.
A caixa de ferramentas é aberta e exibe ferramentas apropriadas ao tipo de diagrama.
Use as ferramentas para criar formas e conectores no diagrama.
Para criar formas, arraste da ferramenta Forma de Exemplo para o diagrama.
Para ligar duas formas, clique na ferramenta Conector de Exemplo, clique na primeira forma e, em seguida, clique na segunda.
Clique nas etiquetas dos objetos para modificá-los.
Seu Visual Studio experimental será semelhante ao exemplo a seguir:
O conteúdo de um modelo
O conteúdo de um arquivo que é uma instância de uma DSL é chamado de modelo. O modelo contém elementosde modelo e links entre os elementos. A definição DSL especifica quais tipos de elementos e links do modelo podem existir no modelo. Por exemplo, em uma DSL criada a partir do modelo Minimal Language, há um tipo de elemento de modelo e um tipo de link.
A definição DSL pode especificar como o modelo aparece em um diagrama. Você pode escolher entre uma variedade de estilos de formas e conectores. Você pode especificar que algumas formas apareçam dentro de outras formas.
Você pode exibir um modelo como uma árvore no modo de exibição Explorer enquanto edita um modelo. À medida que você adiciona formas ao diagrama, os elementos do modelo também aparecem no explorador. O explorador pode ser usado mesmo que não haja diagrama.
Se não conseguir ver o Explorador na instância de depuração do Visual Studio, no menu Ver, aponte para Outras Janelas e, em seguida, clique em <O Explorador de Idiomas>.
A API da sua DSL
Sua DSL gera uma API que permite ler e atualizar modelos que são instâncias da DSL. Uma aplicação da API é gerar arquivos de texto a partir de um modelo. Para obter mais informações, consulte Design-Time geração de código usando modelos de texto T4.
Na solução de resolução de problemas, abra os arquivos de modelo com a extensão ".tt". Esses exemplos demonstram como você pode gerar texto a partir de modelos e permitem que você teste a API de sua DSL. Um dos exemplos é escrito em Visual Basic, o outro em Visual C#.
Em cada arquivo de modelo está o arquivo que ele gera. Expanda o arquivo de modelo no Gerenciador de Soluções e abra o arquivo gerado.
O arquivo de modelo contém um pequeno segmento de código que lista todos os elementos no modelo.
O arquivo gerado contém o resultado.
Quando você altera um arquivo de modelo, você verá as alterações correspondentes nos arquivos gerados depois de regenerar os arquivos.
Para regenerar arquivos de texto depois de alterar o arquivo de modelo
Na instância experimental do Visual Studio, salve o arquivo de modelo.
Certifique-se de que o parâmetro de nome de arquivo em cada arquivo .tt se refere ao arquivo de modelo que você está usando para experimentos. Salve o arquivo .tt.
Clique em Transformar Todos os Modelos na barra de ferramentas do Gerenciador de Soluções.
- ou -
Clique com o botão direito do rato nos modelos que pretende regenerar e, em seguida, clique em Executar Ferramenta Personalizada.
Você pode adicionar qualquer número de arquivos de modelo de texto a um projeto. Cada modelo gera um arquivo de resultado.
Observação
Quando você altera a definição DSL, o código do modelo de texto de exemplo não funcionará, a menos que você o atualize.
Para obter mais informações, consulte Gerando código de uma linguagem Domain-Specific e Escrevendo código para personalizar uma linguagem Domain-Specific.
Personalizando a DSL
Quando desejar modificar a definição de DSL, feche a instância experimental e atualize a definição na instância principal do Visual Studio.
Observação
Depois de modificar a definição de DSL, você pode perder informações nos modelos de teste que você criou usando versões anteriores. Por exemplo, a solução de depuração contém um arquivo chamado Sample, que contém algumas formas e conectores. Depois de começar a desenvolver a sua definição de DSL, os elementos deixarão de ser visíveis e serão perdidos ao guardar o ficheiro.
Você pode fazer uma grande variedade de extensões para o seu DSL. Os exemplos seguintes dar-lhe-ão uma ideia das possibilidades.
Após cada alteração, salve a definição de DSL, clique em Transformar Todos os Modelos no Gerenciador de Soluções e pressione F5 para experimentar a DSL alterada.
Renomeie os tipos e ferramentas
Renomeie as classes e relações de domínio existentes. Por exemplo, a partir de uma definição de Dsl criada a partir do modelo de linguagem mínima, você pode executar as seguintes operações de renomeação, para fazer com que a DSL represente árvores genealógicas.
Para renomear classes, relacionamentos e ferramentas de domínio
No diagrama DslDefinition, renomeie ExampleModel para FamilyTreeModel, ExampleElement para Person, Targets para Parents e Sources para Children. Você pode clicar em cada rótulo para alterá-lo.
Renomeie as ferramentas de elemento e conector.
Abra a janela DSL Explorer clicando na aba em Solution Explorer. Se não conseguir vê-lo, no menu Ver , aponte para Outras Janelas e, em seguida, clique em DSL Explorer. DSL Explorer é visível somente quando o diagrama de definição DSL é a janela ativa.
Abra a janela Propriedades e posicione-a para que você possa ver o DSL Explorer e as Propriedades ao mesmo tempo.
No DSL Explorer, expanda Editor, Toolbox Tabs, <sua DSL> e, em seguida, Ferramentas.
Clique em ExampleElement. Este é o item da caixa de ferramentas que é usado para criar elementos.
Na janela Propriedades, altere a propriedade Name para Person.
Observe que a propriedade Caption também é alterada.
Da mesma maneira, altere o nome da ferramenta ExampleConnector para ParentLink. Altere a propriedade Caption para que ela não seja uma cópia da propriedade Name. Por exemplo, insira Link Principal.
Reconstrua a DSL.
Salve o arquivo de definição DSL.
Clique em Transformar Todos os Modelos na barra de ferramentas do Gerenciador de Soluções
Pressione F5. Aguarde até que a instância experimental do Visual Studio apareça.
Na solução de depuração na instância experimental do Visual Studio, abra um arquivo de modelo de teste. Arraste elementos da caixa de ferramentas para ele. Observe que as legendas da ferramenta e os nomes de tipo no DSL Explorer foram alterados.
Salve o arquivo de modelo.
Abra um arquivo .tt e substitua as ocorrências dos nomes de tipo e propriedade antigos pelos novos nomes.
Certifique-se de que o nome do arquivo especificado no arquivo .tt especifica seu modelo de teste.
Salve o arquivo .tt. Abra o arquivo gerado para ver o resultado da execução do código no arquivo .tt. Verifique se está correto.
Adicionar propriedades de domínio a classes
Adicione propriedades a uma classe de domínio, por exemplo, para representar os anos de nascimento e morte de uma Pessoa.
Para tornar as novas propriedades visíveis no diagrama, você deve adicionar decoradores à forma que exibe o elemento do modelo. Você também deve mapear os imóveis para os decoradores.
Para adicionar propriedades e exibi-las
Adicione as propriedades.
No diagrama de definição DSL, clique com o botão direito do mouse na classe de domínio Person , aponte para Adicionar e clique em Propriedade do domínio.
Digite uma lista de novos nomes de propriedade, como Nascimento e Morte. Pressione Enter depois de cada uma delas.
Adicione decoradores que exibirão as propriedades na forma.
Siga a linha cinza que se estende da classe de domínio Person para o outro lado do diagrama. Este é um mapa dos elementos do diagrama. Ele vincula a classe de domínio a uma classe de forma.
Clique com o botão direito do rato nesta classe de forma, aponte para Adicionar e, em seguida, clique em Decorador de Texto.
Adicione dois decoradores com nomes como BirthDecorator e DeathDecorator.
Selecione cada novo decorador e, na janela Propriedades, defina o campo Posição . Isso determina onde o valor da propriedade de domínio será exibido na forma. Por exemplo, defina InnerBottomLeft e InnerBottomRight.
Mapeie os decoradores para os imóveis.
Abra a janela Detalhes DSL. Geralmente está em uma guia ao lado da janela Saída. Se não conseguir vê-lo, no menu Exibir , aponte para Outras Janelas e clique em Detalhes DSL.
No diagrama de definição do DSL, clique na linha que conecta a classe de domínio Person à classe da forma.
Em Detalhes DSL, no separador Mapas do Decorador, clique na caixa de seleção de um decorador não mapeado. Em Propriedade de Exibição, selecione a propriedade de domínio para a qual deseja mapeá-la. Por exemplo, mapeie BirthDecorator para Birth.
Salve a DSL, clique em Transformar Todos os Modelos e pressione F5.
Em um diagrama de modelo de exemplo, verifique se agora você pode clicar nas posições escolhidas e digitar valores nelas. Além disso, quando você seleciona uma forma Pessoa, a janela Propriedades exibe as novas propriedades Nascimento e Morte.
Em um arquivo .tt, você pode adicionar código que obtém as propriedades de cada pessoa.
Definir Novas Classes
Você pode adicionar classes de domínio e relacionamentos a um modelo. Por exemplo, você pode criar uma nova classe para representar cidades e um novo relacionamento para representar que uma pessoa morava em uma cidade.
Para tornar os diferentes tipos distintos em um diagrama de modelo, você pode mapear as classes de domínio para diferentes tipos de forma ou para formas com geometria e cores diferentes.
Para adicionar e exibir uma nova classe de domínio
Adicione uma classe de domínio e torne-a filha da raiz do modelo.
No diagrama de definição DSL, clique na ferramenta Embedding Relationship , clique na classe raiz FamilyTreeModel e, em seguida, clique em uma parte vazia do diagrama.
Uma nova classe de domínio é exibida, conectada ao FamilyTreeModel com uma relação de incorporação.
Defina o seu nome, por exemplo Cidade.
Observação
Todas as classes de domínio, exceto a raiz do modelo, devem ser o destino de pelo menos uma relação de incorporação ou devem herdar de uma classe que seja o destino de uma incorporação. Por esse motivo, é frequentemente conveniente criar uma classe de domínio usando a ferramenta Embedding Relationship.
Adicione uma propriedade de domínio à nova classe, por exemplo, Name.
Adicione uma relação de referência entre Pessoa e Cidade.
Clique na ferramenta Relação de referência , clique em Pessoa e, em seguida, clique em Cidade.
Observação
As relações de referência representam referências cruzadas de uma parte da árvore modelo para outra.
Adicione uma forma para representar cidades nos diagramas de modelo.
Arraste uma Forma de Geometria da caixa de ferramentas para o diagrama e renomeie-a, por exemplo, TownShape.
Na janela Propriedades, defina os campos Aparência da nova forma, como Cor de Preenchimento e Geometria.
Adicione um Decorator para exibir o nome da cidade e renomeie-o NameDecorator. Defina sua propriedade Position.
Mapeie a classe de domínio Town para TownShape.
Clique na ferramenta Mapa de elementos de diagrama , clique na classe de domínio Town e, em seguida, na classe de forma TownShape.
Na aba Mapas do Decorador da janela Detalhes DSL com o conector do mapa selecionado, marque NameDecorator e defina como propriedade de exibição Nome.
Crie um conector para exibir a relação entre Pessoa e Cidades.
Arraste um conector da caixa de ferramentas para o diagrama. Renomeie-o e defina suas propriedades de aparência.
Use a ferramenta Mapa de Elementos de Diagrama para vincular o novo conector à relação entre Pessoa e cidade.
Crie uma ferramenta de elemento para criar uma nova cidade.
No DSL Explorer, expanda Editor e, em seguida, Toolbox Tabs.
Clique com o botão direito do rato na <DSL> e, em seguida, clique em Ferramenta Adicionar Novo Elemento.
Defina a propriedade Name da nova ferramenta e defina sua propriedade Class como Town.
Defina a propriedade Ícone da caixa de ferramentas . Clique em [...] e no campo Nome do arquivo , selecione um arquivo de ícone.
Crie uma ferramenta de conexão para fazer uma ligação entre cidades e pessoas.
Clique com o botão direito do rato na <DSL> e, em seguida, clique em Adicionar Nova Ferramenta de Conector.
Defina a propriedade Name da nova ferramenta.
Na propriedade ConnectionBuilder, selecione o construtor que contém o nome da relação Person-Town.
Defina o ícone da caixa de ferramentas.
Salve a definição DSL, clique em Transformar todos os modelos e, em seguida, pressione F5.
Na instância experimental do Visual Studio, abra um arquivo de modelo de teste. Utilizar os novos instrumentos para criar cidades e ligações entre cidades e pessoas. Observe que você só pode criar links entre os tipos corretos de elemento.
Crie um código que liste a cidade em que cada pessoa vive. Os modelos de texto são um dos lugares onde você pode executar esse código. Por exemplo, você pode modificar o arquivo Sample.tt existente na solução de depuração para que ele contenha o seguinte código:
<#@ template inherits="Microsoft.VisualStudio.TextTemplating.VSHost.ModelingTextTransformation" debug="true" #> <#@ output extension=".txt" #> <#@ FamilyTree processor="FamilyTreeDirectiveProcessor" requires="fileName='Sample.ftree'" #> <# foreach (Person person in this.FamilyTreeModel.People) { #> <#= person.Name #><#if (person.Town != null) {#> of <#= person.Town.Name #> <#}#> <# foreach (Person child in person.Children) { #> <#= child.Name #> <# } } #>Quando você salva o arquivo *.tt, ele criará um arquivo subsidiário que contém a lista de pessoas e suas residências. Para obter mais informações, consulte Gerando código a partir de uma linguagem Domain-Specific.
Validação e Comandos
Você pode desenvolver ainda mais essa DSL adicionando restrições de validação. Essas restrições são métodos que você pode definir, que garantem que o modelo esteja em um estado correto. Por exemplo, você pode definir uma restrição para garantir que a data de nascimento de uma criança seja posterior à de seus pais. O recurso de validação exibe um aviso se o usuário DSL tentar salvar um modelo que quebre qualquer uma das restrições. Para obter mais informações, consulte Validação em um idioma Domain-Specific.
Você também pode definir comandos de menu que o usuário pode invocar. Os comandos podem modificar o modelo. Eles também podem interagir com outros modelos no Visual Studio e com recursos externos. Para obter mais informações, consulte Como modificar um comando de menu padrão.
Implantando a DSL
Para permitir que outros usuários usem a linguagem específica do domínio, distribua um arquivo de extensão do Visual Studio (VSIX). Isso é criado quando você cria a solução DSL.
Localize o arquivo .vsix na pasta bin da sua solução. Copie-o para o computador no qual deseja instalá-lo. Nesse computador, clique duas vezes no arquivo VSIX. O DSL pode ser usado em todas as instâncias do Visual Studio nesse computador.
Você pode usar o mesmo procedimento para instalar a DSL em seu próprio computador para que você não precise usar a instância experimental do Visual Studio.
Para obter mais informações, consulte Implantando soluções de linguagem Domain-Specific.
Removendo DSLs experimentais antigas
Se você criou DSLs experimentais que não deseja mais, você pode removê-las do seu computador redefinindo a instância experimental do Visual Studio.
Isso removerá do seu computador todas as DSLs experimentais e outras extensões experimentais do Visual Studio. Estas são extensões que foram executadas no modo de depuração.
Este procedimento não remove DSLs ou outras extensões do Visual Studio que foram totalmente instaladas executando o arquivo VSIX.
Para redefinir a instância experimental do Visual Studio
No menu Iniciar do Windows, digite redefinir o Visual Studio e execute o comando Redefinir a Instância Experimental do Microsoft Visual Studio correspondente à sua versão do Visual Studio.
Recrie todas as DSLs experimentais ou outras extensões experimentais do Visual Studio que você ainda deseja usar.