Introdução às linguagens específicas do domínio
Este tópico explica os conceitos básicos em Definindo e usando uma linguagem específica de domínio (DSL).
Se você for inexperiente em DSLs, recomendamos que você trabalhe através do DSL Tools Lab, que pode ser encontrada neste site: Visualizaton e o SDK de modelagem
O que você pode fazer com uma linguagem específica de domínio?
Uma linguagem específica de domínio é uma notação, geralmente gráfica, que é projetada para ser usado para uma finalidade específica. Por outro lado, linguagens como UML são de uso gerais. 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 criado uma DSL, você pode distribuí-lo como parte de um pacote de extensão de integração de Visual Studio (VSIX). Os usuários trabalham com DSL na Visual Studio:
A notação é apenas parte de uma DSL. Junto com a notação, o seu pacote VSIX inclui ferramentas que os usuários podem aplicar para ajudá-los de editar e gerar o material de seus modelos.
Um dos principais aplicativos de DSLs é gerar o código de programa, arquivos de configuração e outros artefatos. Especialmente em projetos grandes e linhas de produtos, onde serão criados diversas variantes de um produto, gerando muitos dos aspectos de variáveis de DSLs pode fornecer um grande aumento na confiabilidade e uma resposta muito rápida a mudanças de requisitos.
O restante dessa visão geral é um passo a passo apresenta as operações básicas de criação e uso de um idioma específico do domínio no Visual Studio.
Pré-requisitos
Para definir uma DSL, você deve ter instalado os seguintes componentes:
Visual Studio |
|
SDK do Visual Studio |
|
SDK de modelagem e visualização de Visual Studio |
Criação de uma solução DSL
Para criar uma nova linguagem específica do domínio, crie um novo Visual Studio solução usando o modelo de projeto de linguagem específica de domínio.
Para criar uma solução DSL
No menu File, aponte para New, e em seguida, clique em Project.
Em tipos de projeto, expanda o Other Project Types nó e clique em extensibilidade.
Clique em Designer de linguagem específica do domínio.
No nome caixa, digite FamilyTree. Clique em OK.
O Assistente de linguagem específica do domínio abre e exibe uma lista de soluções DSL modelo.
Clique em cada modelo para ver uma descrição,
Os modelos são úteis como ponto de partida. Cada um deles fornece um DSL, que podem ser editadas para atender às suas necessidades de trabalho completo. Normalmente, você escolheria o modelo mais próximo de você deseja criar.
Para esta explicação, escolha o Mínimo idioma modelo.
Digite uma extensão de nome de arquivo para seu DSL na página do assistente apropriado. Esta é a extensão de arquivos que contém as ocorrências de seu DSL usarão.
Escolha uma extensão que não está associada a qualquer aplicativo em seu computador ou em qualquer computador em que você deseja instalar o DSL. Por exemplo, docx e htm poderia ser extensões de nome de arquivo inaceitável.
O assistente irá avisá-lo se a extensão que você digitou está sendo usada como uma DSL. Considere o uso de uma extensão de nome de arquivo diferente. Você também pode redefinir a instância Visual Studio SDK Experimental para limpar os designers experimentais antigos. Clique em Iniciar, clique em Todos os programas, Microsoft Visual Studio 2010 SDK, Ferramentase, em seguida Redefinir a instância do Microsoft Visual Studio 2010 Experimental.
Inspecione as outras páginas e, em seguida, clique em Concluir.
É gerada uma solução que contém dois projetos. Eles são chamados de Dsl e DslPackage. Ou seja, um arquivo de diagrama abre nomeado DslDefinition.dsl.
Dica
Maior parte do código que você pode ver nas pastas em dois projetos é gerada a partir de DslDefinition.dsl.Por esse motivo, a maioria das modificações seu DSL são feitas neste arquivo.
Agora, a interface do usuário é semelhante a figura a seguir.
A solução define um idioma específico do domínio. Para obter mais informações, consulte Visão geral da interface de usuário das Ferramentas de Linguagem Específica do Domínio.
As partes importantes da solução DSL
Observe os seguintes aspectos da nova solução.
Dsl\DslDefinition.DSL esse é o arquivo que você vê quando você cria uma solução DSL. Quase todo o código da solução é gerado a partir desse arquivo, e a maioria das alterações feitas em uma definição de DSL é feitas aqui. Para obter mais informações, consulte Working with a Trabalhando com o diagrama de definição de DSL.
Projeto de DSL este projeto contém código que define a linguagem específica de domínio.
Projeto de DslPackage este projeto contém código que permite que as instâncias DSL para ser aberto e editado no Visual Studio.
Executando a DSL.
Você pode executar a solução DSL, assim que você criou. Posteriormente, você pode modificar a definição de DSL gradualmente, o que executa a solução novamente após cada alteração.
Para experimentar o DSL.
Clique em Transformar todos os modelos de na barra de ferramentas do Solution Explorer. Isso gera novamente a maior parte do código fonte do DslDefinition.dsl.
Dica
Sempre que alterar DslDefinition.dsl, você deve clicar em Transformar todos os modelos de antes de recriar a solução.Você pode automatizar essa etapa.Para obter mais informações, consulte Como automatizar a transformação de todos os modelos.
Pressione F5, ou do Debug menu, clique em Start Debugging.
O DSL constrói e é instalado na instância experimental do Visual Studio.
Uma instância experimental do Visual Studio é iniciado. A instância experimental leva suas configurações de uma subárvore separada do registro, onde Visual Studio as extensões são registradas para fins de depuração. Normais instâncias de Visual Studio não têm acesso às extensões registrado lá.
Na instância experimental do Visual Studio, abra o arquivo de modelo chamado teste de Solution Explorer.
- ou -
Clique com o botão direito no projeto de depuração, aponte para Adde, em seguida, clique em Item. No Add Item caixa de diálogo, selecione o tipo de arquivo de seu DSL.
O arquivo de modelo abre como um diagrama em branco.
A caixa de ferramentas é aberta e exibe ferramentas apropriadas para o tipo de diagrama.
Use as ferramentas para criar formas e conectores no diagrama.
Para criar formas, arraste na ferramenta de forma de exemplo para o diagrama.
Para conectar duas formas, clique na ferramenta Conector de exemplo, clique na primeira forma e, em seguida, clique na segunda forma.
Clique nos rótulos das formas para alterá-las.
Seu experimental Visual Studio parecerá com o exemplo a seguir:
O conteúdo de um modelo
O conteúdo de um arquivo que é uma instância de uma DSL é chamado um modelo. O modelo contém modeloelementos e links entre os elementos. A definição de DSL Especifica quais tipos de elementos de modelo e links que podem existir no modelo. Por exemplo, em uma DSL criada usando o modelo de idioma mínima, há um tipo de elemento de modelo e um tipo de link.
A definição de DSL pode especificar como o modelo é exibido em um diagrama. Você pode escolher entre uma variedade de estilos de formas e conectores. Você pode especificar que algumas formas aparecem dentro de outras formas.
Você pode exibir um modelo como uma árvore na Explorer exibir enquanto você estiver editando um modelo. Ao adicionar formas ao diagrama, os elementos de modelo também aparecem no explorer. O explorer pode ser usado mesmo se não houver nenhum diagrama.
Se você não poderá ver o Explorer na instância depuração do Visual Studiodiante do Exibir menu, aponte para Other Windowse, em seguida, clique em <YourLanguage>Explorer.
A API de seu DSL.
O DSL gera uma API que permite ler e atualizar os modelos que são instâncias de DSL. Um aplicativo da API é gerar arquivos de texto de um modelo. Para obter mais informações, consulte Geração de código na hora de design usando modelos de texto T4.
Na solução de depuração, abra os arquivos de modelo com extensão ".tt". Estes exemplos demonstram como você pode gerar o texto de modelos e permitem que você teste a API de seu DSL. Um destes exemplos é escrito em Visual Basic, os outros em Visual C#.
Em cada modelo é o arquivo que ele gera. Expanda o arquivo de modelo no Solution Explorer e abra o arquivo gerado.
O arquivo de modelo contém um pequeno segmento de código que lista todos os elementos do modelo.
O arquivo gerado contém o resultado.
Quando você altera um arquivo de modelo, você verá as alterações correspondentes nos arquivos gerados após você reconstruir os arquivos.
Para recriar os 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 de .tt se refere ao arquivo de modelo que você está usando para experimentos. Salve o arquivo .tt.
Clique em Transformar todos os modelos de na barra de ferramentas do Solution Explorer.
- ou -
Os modelos que você deseja gerar novamente e, em seguida, clique com o botão direito Ferramenta personalizado para executar.
Você pode adicionar qualquer número de arquivos de modelo de texto a um projeto. Cada modelo gera um arquivo de resultado.
Dica
Quando você altera a definição de DSL, o código de modelo de texto de exemplo não funcionará, a menos que você atualizá-lo.
Para obter mais informações, consulte Gerando código a partir de uma linguagem específica do domínio e Escrevendo código para personalizar uma linguagem específica do domínio.
Personalizando a DSL
Quando você deseja modificar a definição de DSL, feche a instância experimental e atualizar a definição principal Visual Studio instância.
Dica
Depois que você tiver modificado a definição de DSL, você poderá perder dados nos modelos de teste que você criou usando versões anteriores.Por exemplo, a solução de depuração contém um arquivo chamado amostra, que contém algumas formas e conectores.Depois de começar a desenvolver sua definição de DSL, eles não estarão visíveis, e eles serão perdidos quando você salva o arquivo.
Você pode fazer uma grande variedade de extensões de seu DSL. Os exemplos a seguir lhe dará uma impressão das possibilidades.
Após cada alteração, salvar a definição de DSL, clique em Transformar todos os modelos de em Solution Explorere então pressione F5 para experimentar o DSL alterado.
Renomear os tipos e ferramentas
Renomeie as classes de domínio existentes e os relacionamentos. Por exemplo, a partir de uma definição de Dsl criados usando o modelo de idioma mínimo, você pode executar as seguintes operações de renomeação, para tornar o DSL representam as árvores de famílias.
Para renomear a ferramentas, relacionamentos e classes de domínio
No diagrama de DslDefinition, renomeie ExampleModel para FamilyTreeModel, ExampleElement, pessoa, destinos para os pais e fontes para os filhos. Você pode clicar em cada etiqueta para alterá-lo.
Renomeie as ferramentas de elemento e o conector.
Abra a janela do Explorer DSL, clicando na guia em Solution Explorer. Se você não pode vê-lo, no Exibir menu, aponte para Other Windows e, em seguida, clique em Explorer DSL. DSL Explorer fica visível somente quando o diagrama de definição de DSL é a janela ativa.
Abra a janela Properties e posicione-a para que você possa ver o Gerenciador de DSL e propriedades ao mesmo tempo.
No Explorer DSL, expanda Editor, Toolbox Tabs, < sua DSL >e, em seguida Ferramentas.
Clique em ExampleElement. Este é o item de caixa de ferramentas que é usado para criar elementos.
Na janela Properties, altere o nome propriedade para a pessoa.
Observe que o legenda propriedade também muda.
Da mesma maneira, altere o nome da ferramenta ExampleConnector para ParentLink. Alterar o legenda propriedade para que ela não seja uma cópia da propriedade Name. Por exemplo, insira o Link do pai.
Reconstrua o DSL.
Salve o arquivo de definição de DSL.
Clique em Transformar todos os modelos de na barra de ferramentas do Solution Explorer
Pressione F5. Aguarde até que a instância experimental do Visual Studio é exibida.
Na solução de depuração na instância experimental do Visual Studio, abra um arquivo de modelo de teste. Arraste os elementos na caixa de ferramentas. Observe que as legendas de ferramenta e os nomes de tipo no Explorer DSL foram alterados.
Salve o arquivo de modelo.
Abrir um arquivo de .tt e substituir ocorrências dos nomes de tipo e propriedade antigos com os novos nomes.
Certifique-se de que o nome do arquivo que está especificado no arquivo .tt Especifica o modelo do seu teste.
Salve o arquivo .tt. Abra o arquivo gerado para ver o resultado da execução do código no arquivo .tt. Verifique se ele está correto.
Adicionar propriedades do domínio às Classes
Adicione propriedades a uma classe de domínio, por exemplo representar os anos de nascimento e morte de uma pessoa.
Para tornar as novas propriedades visível no diagrama, você deve adicionar decoradores na forma que exibe o elemento de modelo. Você também deve mapear as propriedades para os decoradores.
Adicionar propriedades e exibi-las
Adicione as propriedades.
No diagrama de definição de DSL, a classe de domínio da pessoa de atalho, aponte para Adde, em seguida, clique em Propriedade Domain.
Digite uma lista dos novos nomes de propriedades, como o nascimento e morte. Pressione Enter a cada vez.
Adicione decoradores que exibirão as propriedades da forma.
Siga a linha cinza que estende a partir da classe de domínio da pessoa para o outro lado do diagrama. Este é um mapa de elemento de diagrama. Ele vincula a classe de domínio para uma classe shape.
Essa classe de forma com o botão direito, aponte para Adde, em seguida, clique em A decorador de texto.
Adicione dois decoradores com nomes como, por exemplo, BirthDecorator e DeathDecorator.
Selecione cada novo decorator e na janela Properties, defina a posição campo. Isso determina qual o valor da propriedade de domínio será exibido na forma. Por exemplo, definir InnerBottomLeft e InnerBottomRight.
Mapeie os decoradores para as propriedades.
Abra a janela de detalhes de DSL. Geralmente, é uma guia ao lado da janela de saída. Se você não pode vê-lo, no Exibir , aponte para Other Windowse, em seguida, clique em DSL detalhes.
No diagrama de definição de DSL, clique na linha que conecta a classe de domínio da pessoa para a classe shape.
Em DSL detalhesdiante a Mapas do decorador , clique em caixa de seleção em um decorador não mapeado. Em Propriedade Display, selecione a propriedade de domínio ao qual você deseja que ele mapeados. Por exemplo, mapear BirthDecorator para o nascimento.
Salvar a DSL, clique em transformar todos os modelos e pressione F5.
Em um diagrama de modelo de exemplo, verifique se você pode agora clique as posições que você escolheu e digite valores para eles. Além disso, quando você seleciona uma forma pessoa, a janela Propriedades exibe as propriedades de novas nascimento e morte.
Em um arquivo de .tt, você pode adicionar código que obtém as propriedades de cada pessoa.
Novas classes
Você pode adicionar classes de domínio e relacionamentos para um modelo. Por exemplo, você poderia criar uma nova classe para representar cidades e uma nova relação para representar que uma pessoa viver 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 formas com cores e geometria diferente.
Para adicionar e exibir uma nova classe de domínio
Adicionar uma classe de domínio e torná-lo um filho da raiz do modelo.
No diagrama de definição de DSL, clique o Relacionamento de incorporação de ferramenta, clique na classe de raiz FamilyTreeModel e, em seguida, clique em uma parte vazia do diagrama.
Uma nova classe de domínio aparece, está conectado a FamilyTreeModel com um relacionamento de incorporação.
Defina seu nome, por exemplo cidade.
Dica
Cada classe de domínio, exceto a raiz do modelo deve ser o destino de pelo menos uma relação de incorporação ou ela deve herdar de uma classe que é o destino de uma incorporação.Por esse motivo, é conveniente com freqüência criar uma classe de domínio usando a ferramenta de relacionamento de incorporação.
Adicione uma propriedade de domínio para a nova classe, por exemplo nome.
Adicione uma relação de referência entre a pessoa e cidade.
Clique no Relação de referência ferramenta e em pessoa, em seguida, clique em cidade.
Dica
Relações de referência que representam as referências cruzadas de uma parte da árvore modelo para outro.
Adicione uma forma para representar as cidades em diagramas de modelo.
Arraste um A forma de geometria da toolbox para o diagrama e renomeá-lo, por exemplo TownShape.
Na janela Properties, defina os campos de aparência da nova forma, como cor de preenchimento e geometria.
Adicione a decorador para exibir o nome da cidade e renomeá-lo NameDecorator. Defina sua propriedade de posição.
Mapear a classe de domínio da cidade para o TownShape.
Clique no Mapa de elemento de diagrama de ferramenta e clique na classe de domínio de cidade e, em seguida, a classe de forma TownShape.
No Mapas do decorador guia da DSL detalhes janela com o conector de mapa selecionado, verifique NameDecorator e definir Propriedade Display ao nome.
Crie um conector para exibir o relacionamento entre a pessoa e cidades.
Arraste um conector na caixa de ferramentas para o diagrama. Renomeá-lo e definir suas propriedades de aparência.
Use o Mapa de elemento de diagrama de ferramenta para vincular o novo conector para a relação entre a pessoa e cidade.
Crie uma ferramenta de elemento para tornar uma cidade de novo.
Em Explorer DSL, expanda Editor , em seguida, Toolbox Tabs.
Com o botão direito < sua DSL > e, em seguida, clique em Adicionar uma nova ferramenta de elemento.
Definir o nome propriedade da nova ferramenta e definir sua classe propriedade para a cidade.
Definir o Ícone da caixa de ferramentas propriedade. Click [...] e de nome do arquivo , selecione um arquivo de ícone.
Crie uma ferramenta de conector para tornar um vínculo entre as cidades e pessoas.
Com o botão direito < sua DSL > e, em seguida, clique em Adicionar uma nova ferramenta de conector.
Defina a propriedade do nome da nova ferramenta.
No ConnectionBuilder propriedade, selecione o construtor que contém o nome do relacionamento pessoa-cidade.
Definir o ícone da caixa de ferramentas.
Salvar a definição de DSL, clique em Transformar todos os modelos dee então pressione F5.
Na instância experimental do Visual Studio, abra um arquivo de modelo de teste. Use as novas ferramentas para criar cidades e links entre as cidades e pessoas. Observe que você só pode criar vínculos entre os tipos corretos do elemento.
Crie um código que lista a cidade na qual cada pessoa reside. Os modelos de texto são um dos locais onde você pode executar esse código. Por exemplo, você poderia modificar o arquivo de Sample.tt existente na solução de depuração para que contenha o código a seguir:
<#@ 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 da subsidiária 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 específica do domínio.
Validação e comandos
Você poderá desenvolver ainda mais essa DSL adicionando restrições de validação. Essas restrições são métodos que você pode definir, certifique-se de que o modelo estiver em um estado correto. Por exemplo, você poderia definir uma restrição para certificar-se que a data de nascimento de uma criança é mais recente do que seus pais. O recurso de validação exibe um aviso se o usuário DSL tenta salvar um modelo que divide a qualquer uma das restrições. Para obter mais informações, consulte Validação em uma linguagem específica do domínio.
Você também pode definir os comandos de menu que o usuário possa chamar. 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 em uma linguagem específica do domínio.
Implantando o DSL.
Para permitir que outros usuários usem a linguagem específica de domínio, você distribuir uma Visual Studio o arquivo de extensão (VSIX). Isso é criado quando você constrói a solução DSL.
Localize o arquivo .vsix na pasta bin da sua solução. Copie-o para o computador no qual você deseja instalá-lo. Nesse computador, clique duas vezes no arquivo VSIX. O DSL pode ser usado em todas as instâncias de Visual Studio nesse computador.
Você pode usar o mesmo procedimento para instalar o DSL no seu próprio computador para que você não precisará usar a instância experimental do Visual Studio.
Para obter mais informações, consulte Implantando soluções de linguagem específica do domínio.
Removendo antigos DSLs Experimental
Se você tiver criado as DSLs experimentais que não deseja mais, você poderá removê-los do seu computador, redefinindo o Visual Studio instância Experimental.
Isso removerá do seu computador, todas as DSLs experimentais e outros experimental Visual Studio as extensões. Estas são as extensões que foram executadas no modo de depuração.
Esse procedimento não remove as DSLs ou outros Visual Studio as extensões que foram totalmente instaladas, executando o arquivo VSIX.
Para redefinir a instância Visual Studio Experimental
Clique em Iniciar, clique em Todos os programas, Microsoft Visual Studio 2010 SDK, Ferramentase, em seguida Redefinir a instância do Microsoft Visual Studio 2010 Experimental.
Reconstruir qualquer DSLs experimentais ou outros experimental Visual Studio as extensões que deseja usar.
Consulte também
Conceitos
Noções básicas sobre modelos, classes e relações
Como definir uma linguagem específica do domínio