ASP.NET Core: dicas úteis para o dia a dia de um Desenvolvedor - Parte 1
Este artigo inicia uma série com dicas que considero úteis para Desenvolvedores que empreguem o ASP.NET Core na implementação de soluções. Tais recomendações têm por objetivo:
- Simplificar o desenvolvimento;
- Escrever menos código;
- Implementar soluções mais elegantes;
- Empregar padrões de mercado.
Se você chegou até aqui e tem interesse em conhecer mais sobre o desenvolvimento de soluções Web utilizando o Azure, aproveito este espaco para mais um convite… Que tal aprender mais sobre a nuvem Microsoft, em um workshop que acontecerá durante um sábado (dia 21/09) em São Paulo Capital e implementando na prática um case que combina o uso de tecnologias como Azure App Service, Azure SQL, Azure Storage, Azure Functions e Application Insights? Acesse então o link a seguir para efetuar sua inscrição com um desconto especial: http://bit.ly/anp-dicas-aspnet
Suporte a JSON no SQL Server
Embora no .NET Core exista o suporte às principais tecnologias relacionais do mercado, muitas aplicações ASP.NET Core utilizam bases de dados a partir de servidores SQL Server.
Desde a versão 2016 o SQL Server conta com o suporte ao formato JSON, inclusive com a possibilidade de se formatar e converter o resultado de uma query para este padrão. Tal característica acaba por se revelar como muito útil em projetos Web, uma vez que dispensará a escrita de várias classes para retorno de informações e trará ganhos de performance evitando diversas operações de transformação de dados.
Na listagem a seguir temos um exemplo de uso deste recurso (cláusula FOR JSON):
O projeto em questão faz uso do micro-ORM Dapper e foi disponibilizado no GitHub:
https://github.com/renatogroffe/Dapper-DotNetCore2.1
Tendo ainda sido apresentado em detalhes no seguinte artigo:
.NET + SQL Server 2017 - Parte 2: retornado consultas em JSON (exemplo com ASP.NET Core + Dapper)
Habilitando o uso de CORS
Ativar a utilização de CORS (Cross-origin resource sharing) corresponde a uma prática extremamente em projetos que contem com APIs REST e front-ends baseados em JavaScript. No caso específico do ASP.NET Core este procedimento envolverá ajustes na classe Startup de uma API:
- Uma chamada ao método AddCors em ConfigureServices;
- Acionar ainda o uso do middleware UseCors no método Configure.
Extensions Methods para uma melhor organização na classe Startup
É praticamente certo que ajustes serão realizados na classe Startup nos mais variados tipos de projetos baseados no ASP.NET Core. Independente das necessidades da aplicação, há uma forte tendência de que a quantidade de código envolvendo acertos de configuração aumente consideravelmente com o decorrer do tempo.
Como então evitar que a classe Startup atinja então centenas ou, até mesmo, milhares de linhas de código?
Extensões/Extension Methods contribuem para um código mais limpo, além de promover o reuso (com a criação de bibliotecas contendo tais extensões) e evitar o surgimento diversas classes derivadas de tipos básicos da plataforma.
O artigo a seguir aborda esta questão, através de um exemplo prático abordando as configurações para utilização de JWT (JSON Web Tokens) em uma API REST:
ASP.NET Core: dica simples para obter um código mais limpo na classe Startup
Configurando a cultura
Muitos Desenvolvedores se esquecem que o deployment de aplicações em Produção pode acontecer em ambientes com configurações regionais diferentes das encontradas em suas máquinas. Isto muito provavelmente acarretará em problemas como erros na conversão de dados ou formatação de valores.
A solução para isto passa por ajustes com o intuito de especificar as culturas/padrões esperados para o projeto via mecanismo de Localization do ASP.NET Core. No próximo artigo temos um exemplo disto, no qual foi apresentada uma alternativa para corrigir problemas de conversão em uma aplicação que faz uso de Docker:
ASP.NET Core: solucionando erros de conversão/formatação com Localization
Gerando um site para documentação/testes de APIs REST com Swagger
O Swagger é uma solução compatível com as principais plataformas de desenvolvimento Web e que possibilita a geração de um site documentando APIs com pouquíssimo código, além de contar com funcionalidades para testes e geração de um documento JSON contendo toda a estrutura de um projeto.
Para ativar o uso do Swagger em APIs REST criadas com o ASP.NET Core será necessário:
- Adicionar o package Swashbuckle.AspNetCore ao projeto;
- Invocar o método AddSwaggerGen em ConfigureServices na classe Startup, repassando ao mesmo dados informativos sobre o projeto;
- Acionar ainda os middlewares UseSwagger e UseSwaggerUI no método Configure de Startup, a fim de habilitar o Swagger na aplicação.
Na listagem a seguir podemos observar os ajustes esperados para a classe Startup:
Este exemplo foi também disponibilizado no GitHub:
https://github.com/renatogroffe/ASPNETCore2.1_Swagger
Na próxima imagem está um exemplo de site de documentação gerado pelo Swagger:
Retornando objetos a partir de configurações declaradas no arquivo appsettings.json
Uma das grandes novidades do ASP.NET Core foi a substituição do Web.config pelo arquivo appsettings.json. Esta mudança de XML para JSON foi acompanhada por uma série de facilidades oferecidas pela plataforma, simplificando de maneira bastante significativa a manipulação de itens de configuração.
Na listagem a seguir temos um exemplo de conjunto de configurações com dados do Brasil no arquivo appsettings.json de um projeto ASP.NET Core:
Já a próxima listagem traz uma estrutura de classes utilizada para representar os dados vinculados ao item DadosPais em appsettings.json:
Uma possibilidade para carregamento das informações declaradas em appsettings.json está indicada naseguinte implementação da classe Startup:
Através da classe ConfigureFromConfigurationOptions (namespace Microsoft.Extensions.Options) podemos simplificar este conjunto de instruções de leitura que englobou 16 linhas de código, reduzindo esta ação para um equivalente de apenas 3 linhas. É o que demonstra a listagem a seguir:
Na próxima imagem é possível constatar que o objeto do tipo DadosPais foi carregado corretamente por meio do uso de ConfigureFromConfigurationOptions: