Validar o código com diagramas de dependência

Por que usar diagramas de dependência?

Para garantir que o código não entre em conflito com seu design, valide seu código com diagramas de dependência no Visual Studio. Isso pode ajudar a:

  • Encontrar conflitos entre dependências no código e nas dependências do diagrama de dependências.

  • Encontre dependências que talvez sejam afetadas por alterações propostas.

    Por exemplo, é possível editar o diagrama de dependências para mostrar alterações na arquitetura em potencial e, em seguida, validar o código para ver as dependências afetadas.

  • Refatore ou migre o código para um design diferente.

    Encontre o código ou as dependências que exijam trabalho quando você move o código para uma arquitetura diferente.

Requirements

  • Visual Studio

    Para criar um diagrama de dependências para um projeto do .NET Core, você precisa ter o Visual Studio 2019 versão 16.2 ou posterior.

  • Uma solução com um projeto de modelagem com um diagrama de dependências. Esse diagrama de dependências precisa ser vinculado a artefatos em C# ou projetos do Visual Basic que você deseja validar. Confira Criar diagramas de dependências com base no código.

Para ver quais edições do Visual Studio dão suporte a esse recurso, confira Suporte de edição para ferramentas de arquitetura e modelagem.

É possível validar manualmente o código a partir de um diagrama de dependências aberto no Visual Studio ou de um prompt de comando. Também é possível validar o código automaticamente durante a execução de builds locais ou de builds do Azure Pipelines.

Importante

Se você quiser executar a validação de camada usando o TFS (Team Foundation Server), também precisará instalar a mesma versão do Visual Studio no servidor de build.

Validação de dependências dinâmica

A validação de dependências ocorre em tempo real e os erros são mostrados imediatamente na Lista de Erros.

  • Há suporte para validação dinâmica para C# e Visual Basic.

  • Para habilitar a análise da solução completa ao usar a validação de dependências dinâmica, abra as configurações de opções da barra de ouro que aparece na Lista de Erros.

    • Você poderá ignorar permanentemente a barra de ouro se não estiver interessado em ver todos os problemas de arquitetura em sua solução.
    • Se você não habilitar a análise da solução completa, a análise será feita somente para os arquivos que estão sendo editados.
  • Ao atualizar projetos para habilitar a validação dinâmica, uma caixa de diálogo mostra o progresso da conversão.

  • Ao atualizar um projeto para validação de dependências dinâmica, a versão do pacote NuGet é atualizada para ser a mesma para todos os projetos e é a versão mais alta em uso.

  • A adição de um novo projeto de validação de dependências dispara uma atualização do projeto.

Verificar se um item dá suporte à validação

É possível vincular camadas a sites, documentos do Office, arquivos de texto sem formatação e arquivos em projetos compartilhados entre vários aplicativos, mas o processo de validação não os incluirá. Os erros de validação não serão exibidos para referências a projetos ou assemblies vinculados a camadas separadas quando nenhuma dependência for exibida entre essas camadas. Essas referências não serão consideradas dependências, a menos que o código use essas referências.

  1. No diagrama de dependências, selecione uma ou mais camadas, clique com o botão direito do mouse na seleção e, em seguida, clique em Exibir Links.

  2. No Gerenciador de Camadas, examine a coluna Dá Suporte à Validação. Se o valor for falso, o item não dará suporte à validação.

Incluir outros assemblies e projetos do .NET para validação

Quando você arrasta itens para o diagrama de dependências, as referências para os assemblies ou projetos do .NET correspondentes são adicionadas automaticamente à pasta Referências de Camada no projeto de modelagem. Essa pasta contém referências aos assemblies e aos projetos analisados durante a validação. É possível incluir outros assemblies e projetos do .NET para avaliação sem arrastá-los manualmente para o diagrama de dependências.

  1. No Gerenciador de Soluções, clique com botão direito do mouse no projeto de modelagem ou na pasta Referências de Camada e, em seguida, clique em Adicionar Referência.

  2. Na caixa de diálogo Adicionar Referência, selecione os assemblies ou os projetos e, em seguida, clique em OK.

Validar código manualmente

Se tiver um diagrama de dependências aberto vinculado a itens de solução, você poderá executar o comando de atalho Validar no diagrama. Você também pode usar o prompt de comando para executar o comando msbuild com a propriedade personalizada /p:ValidateArchitecture definida como True. Por exemplo, à medida que fizer alterações no código, execute a validação da camada regularmente de forma que você possa capturar conflitos de dependência com antecedência.

Validar o código de um diagrama de dependências aberto

  1. Clique com o botão direito do mouse na superfície do diagrama e, em seguida, clique em Validar Arquitetura.

    Observação

    Por padrão, a propriedade Compilar Ação no arquivo do diagrama de camada (.layerdiagram) é definida como Validar, de modo que o diagrama é incluído no processo de validação.

    A janela Lista de Erros relata todos os erros ocorridos. Para obter mais informações sobre erros de validação, confira Solucionar problemas de validação de camada.

  2. Para exibir a origem de cada erro, clique duas vezes no erro na janela Lista de Erros.

    Observação

    O Visual Studio pode mostrar um mapa de código em vez da origem do erro. Isso ocorre quando o código tem uma dependência em um assembly não especificado pelo diagrama de dependências ou o código não tem uma dependência especificada pelo diagrama de dependências. Examine o mapa de códigos ou o código para determinar se a dependência deve existir. Para obter mais informações sobre mapas de código, confira Mapear as dependências nas soluções.

  3. Para gerenciar erros, confira Resolver erros de validação de camada.

Validar o código no prompt de comando

  1. Abra o prompt de comando do Visual Studio.

  2. Escolha uma destas opções:

    • Para validar o código em um projeto de modelagem específico na solução, execute MSBuild com a propriedade personalizada a seguir.

      msbuild <FilePath+ModelProjectFileName>.modelproj /p:ValidateArchitecture=true
      
      • ou –

        Navegue até a pasta que contém o arquivo de modelagem do projeto (.modelproj) e o diagrama de dependências e, em seguida, execute MSBuild com a seguinte propriedade personalizada:

        msbuild /p:ValidateArchitecture=true
        
    • Para validar o código em todos os projetos de modelagem na solução, execute MSBuild com a seguinte propriedade personalizada:

      msbuild <FilePath+SolutionName>.sln /p:ValidateArchitecture=true
      
      • ou –

        Navegue até a pasta da solução, que precisa conter um projeto de modelagem com um diagrama de dependências e, em seguida, execute MSBuild com a seguinte propriedade personalizada:

        msbuild /p:ValidateArchitecture=true
        

      Todos os erros ocorridos serão listados. Para obter mais informações sobre o MSBuild, confira MSBuild e Tarefa MSBuild.

    Para obter mais informações sobre erros de validação, confira Solucionar problemas de validação de camada.

Gerenciar erros na validação

Durante o processo de desenvolvimento, você talvez queira suprimir alguns dos conflitos reportados durante a validação. Por exemplo, você talvez queira suprimir erros que já esteja resolvendo ou que não sejam relevantes para seu cenário específico. Quando você suprime um erro, é uma prática recomendada registrar em log um item de trabalho no Team Foundation.

Aviso

Você já precisa estar conectado ao SCC (controle do código-fonte) do TFS para criar ou vincular a um item de trabalho. Se você tentar abrir uma conexão com um SCC do TFS diferente, o Visual Studio fechará a solução atual automaticamente. Verifique se você já está conectado ao SCC apropriado antes de tentar criar ou vincular a um item de trabalho. Em versões posteriores do Visual Studio, os comandos de menu não estarão disponíveis se você não estiver conectado a um SCC.

Criar um item de trabalho para um erro de validação

  • Na janela Lista de Erros, clique com o botão direito do mouse no erro, aponte para Criar Item de Trabalho e, em seguida, clique no tipo de item de trabalho que você deseja criar.

Use estas tarefas para gerenciar erros de validação na janela Lista de Erros:

Para Siga estas etapas
Suprimir erros selecionados durante a validação Clique com o botão direito do mouse em um ou em vários erros selecionados, aponte para Gerenciar Erros de Validação e, em seguida, clique em Suprimir Erros.

Os erros suprimidos são exibidos com formatação de tachado. Quando você executar a validação da próxima vez, esses erros não serão exibidos.

Os erros suprimidos são acompanhados em um arquivo .suppressions para o arquivo do diagrama de dependências correspondente.
Parar a supressão de erros selecionados Clique com o botão direito do mouse no erro ou nos erros suprimidos selecionados, aponte para Gerenciar Erros de Validação e, em seguida, clique em Parar de Suprimir Erros.

Os erros suprimidos selecionados serão exibidos quando você executar a validação na próxima vez.
Restaurar todos os erros suprimidos na janela Lista de Erros Clique com o botão direito do mouse em qualquer lugar na janela Lista de Erros, aponte para Gerenciar Erros de Validação e, em seguida, clique em Mostrar Todos os Erros Suprimidos.
Ocultar todos os erros suprimidos na janela Lista de Erros Clique com o botão direito do mouse em qualquer lugar na janela Lista de Erros, aponte para Gerenciar Erros de Validação e, em seguida, clique em Ocultar Todos os Erros Suprimidos.

Validar código automaticamente

É possível executar a validação da camada sempre que você executa uma compilação local. Se a equipe usar o Azure DevOps, será possível executar a validação da camada com check-ins restritos, que você pode especificar criando uma tarefa MSBuild personalizada, e usar relatórios de build para coletar erros de validação. Para criar builds de check-in restrito, confira Check-in restrito do TFVC.

Para validar automaticamente o código durante uma compilação local

Use um editor de texto para abrir o arquivo do projeto de modelagem (.modelproj) e, em seguida, inclua a seguinte propriedade:

<ValidateArchitecture>true</ValidateArchitecture>

- ou -

  1. No Gerenciador de Soluções, clique com botão direito do mouse no projeto de modelagem que contém o diagrama ou os diagramas de dependências e, em seguida, clique em Propriedades.

  2. Na janela Propriedades, defina a propriedade Validar Arquitetura do projeto de modelagem como True.

    Isso inclui o projeto de modelagem no processo de validação.

  3. No Gerenciador de Soluções, clique com o botão direito do mouse no arquivo do diagrama de dependências (.layerdiagram) que você deseja usar para validação.

  4. Na janela Propriedades, verifique se a propriedade Compilar Ação do diagrama está definida como Validar.

    Isso inclui o diagrama de dependências no processo de validação.

Para gerenciar erros na janela Lista de Erros, confira Resolver erros de validação de camadas.

Solucionar problemas de validação da camada

A tabela a seguir descreve problemas na validação da camada e sua resolução. Esses problemas são diferentes dos erros resultantes de conflitos entre o código e o design. Para obter mais informações sobre esses erros, confira Solucionar problemasde validação de camadas.

Problema Possível causa Resolução
Os erros de validação não ocorrem como esperado. A validação não funciona em diagramas de dependências copiados de outros diagramas de dependências no Gerenciador de Soluções e que estejam no mesmo projeto de modelagem. Os diagramas de dependências copiados dessa maneira contêm as mesmas referências do diagrama de dependências original. Adicione um novo diagrama de dependências ao projeto de modelagem.

Copie os elementos do diagrama de dependências de origem para o novo diagrama.

Resolver erros de validação de camadas

Quando você valida o código em um diagrama de dependências, os erros de validação ocorrem quando o código entra em conflito com o design. Por exemplo, as seguintes condições podem fazer os erros de validação ocorrerem:

  • Um artefato é atribuído à camada errada. Nesse caso, mova o artefato.

  • Um artefato como, por exemplo, uma classe usa outra classe de maneira a entrar em conflito com a arquitetura. Nesse caso, refatore o código para remover a dependência.

Para resolver esses erros, atualize o código até que mais nenhum erro seja exibido durante a validação. É possível realizar essa tarefa de maneira iterativa.

A seção a seguir descreve a sintaxe usada nesses erros, explica o significado desses erros e sugere o que é possível fazer para o resolver ou gerenciá-los.

Sintaxe Descrição
ArtifactN(ArtifactTypeN) ArtifactN é um artefato associado a uma camada no diagrama de dependências.

ArtifactTypeN é o tipo de ArtifactN como, por exemplo, Class ou Method:

MySolution.MyProject.MyClass.MyMethod(Method)
NomeNamespaceN O nome de um namespace.
NomeCamadaN O nome de uma camada no diagrama de dependências.
DependencyType O tipo de relação de dependência entre Artifact1 e Artifact2. Por exemplo, Artifact1 tem uma relação do tipo Calls com Artifact2.
Erro de Sintaxe Descrição do erro
DV0001: dependência inválida Esse problema é relatado quando um elemento de código (namespace, tipo, membro) mapeado para uma Camada faz referência a um elemento de código mapeado para outra camada, mas não há nenhuma seta de dependência entre essas camadas no diagrama de validação de dependências que contém essas camadas. Essa é uma violação de restrição de dependência.
DV1001: nome do namespace inválido Esse problema é relatado em um elemento de código associado a uma camada cuja propriedade "Nomes de Namespace Permitidos" não contém o namespace no qual esse elemento de código é definido. Essa é uma violação de restrição de nomenclatura. Observe que a sintaxe de "Nomes de Namespace Permitidos" deve ser uma lista de namespaces separada por ponto e vírgula nos quais é permitido definir os elementos de código associados à camada.
DV1002: dependência de namespace não referenciável Esse problema é relatado em um elemento de código associado a uma camada e referenciando outro elemento de código definido em um namespace definido na propriedade "Namespace Não Referenciável" da camada. Essa é uma violação de restrição de nomenclatura. Observe que a propriedade "Namespaces Não Referenciáveis" é definida como uma lista de namespaces separada por ponto e vírgula que não devem ser referenciados em elementos de código associados a essa camada.
DV1003: nome do namespace não permitido Esse problema é relatado em um elemento de código associado a uma camada que a propriedade "Nomes de Namespace não permitidos" contém o namespace no qual esse elemento de código é definido. Essa é uma violação de restrição de nomenclatura. Observe que a propriedade "Nome do namespace não permitido" é definida como uma lista de namespaces separada por ponto e vírgula em que os elementos de código associados a essa Camada não devem ser definidos.
DV2001: presença de diagrama de camada Esse problema é relatado em um projeto que não inclui um arquivo de diagrama de dependências, mas se refere aos analisadores de validação de dependências. Se a Validação de Dependências não tiver sido usada, você poderá remover "Microsoft.DependencyValidation.Analyzers" diretamente do Gerenciador de Soluções ou suprimir esse aviso. Para adicionar um diagrama de dependências, confira Criar diagramas de dependências com base no código.
DV2002: base de tipos não mapeados Esse problema é relatado quando um elemento de código não é mapeado para nenhuma camada.
DV3001: Link Ausente A camada 'LayerName' se vincula a 'Artifact', que não pode ser encontrado. Você não tem uma referência de assembly?
DV9001: a análise de arquitetura encontrou erros internos Os resultados talvez não estejam completos. Para obter mais informações, consulte o log de eventos da compilação detalhado ou a janela de saída.