SlideShare uma empresa Scribd logo
MÁRCIO R. NIZZOLA
MVP DEVELOPER TECHNOLOGIES
MARCIONIZZOLA@GMAIL.COM
Como partir do zero e entregar uma API
profissional com .NET 7 e Minimal Api
#VSSUMMIT
INTRODUÇÃO
#VSSUMMIT
• O conceito de Minimal API foi introduzido no .NET 6 tornando muito mais simples a
implementação de um endpoint dado que anteriormente tínhamos a Controller, que
precisava de uma série de configurações específicas.
• Além disso, unido ao lançamento deste conceito, o C# 10 mudou também a forma
como se inicializa uma aplicação onde agora o program.cs incorporou o conceito “top
level statements” (instruções de nível superior) simplificando muito a inicialização da
aplicação.
Nota: Para quem ainda não utiliza o Visual Studio 2022, estes dois itens não serão
interpretados corretamente, caso não tenha a licença, uma recomendação é utilizar o VS
Code.
IMPLEMENTAÇÃOBÁSICADEUMAMINIMALAPI
#VSSUMMIT
dotnet new web --name TestApi
OBJETIVO
#VSSUMMIT
Ao final desta apresentação teremos uma API com:
- Utilização de Minimal Api´s
- Organização de seus endpoints escritos com conceito Minimal Api
- Implementação de Route Groups para melhorar a documentação
- Implementação de Configurações personalizadas
- Melhoria na injeção de dependência
- Implementação de Logging
- Implementação de HealthChecks
- Implementação de Output Cache
- Implementação de Rate Limit
COMOERAUMAAPIANTESCOMCONTROLLERS
#VSSUMMIT
program.cs WeatherForecastController.cs
CRIAÇÃODAAPIUTILIZANDOOVISUALSTUDIO
#VSSUMMIT
A partir do Visual Studio 2022 novos
checkboxes foram adicionados para
selecionar as opções que contemplam:
- Usar ou não Controllers (Minimal Api)
- Habilitar OpenApi (Swagger)
- Utilizar instruções de nível superior
NOVOTEMPLATE
#VSSUMMIT
Podemos destacar alguns detalhes
- O resultado é o mesmo e vemos que já
tem menos linhas de código.
- A declaração do endpoint é feita com
um simples comando “app.MapGet”
não precisando de arquivo separado
como era feito na Controller com uma
série de itens obrigatórios.
- Esta versão já contempla o Swagger
também.
Ponto negativo:
- Para um endpoint é tudo lindo, mas se
tiver mais começa a ficar complexo.
- Tem variáveis de negócio e classes no
program.cs !
1ªMELHORIA–ORGANIZAÇÃO
#VSSUMMIT
Para melhor organização podemos criar uma
classe com os endpoints separados.
Podemos fazer de três formas:
- através do famoso “Scaffolding” que
pode criar uma classe e já montar todos
os métodos “Crud” conectando também
ao Entity Framework.
- Através do “Scaffolding” mas apenas
criando os endpoints para os principais
verbos sem conexão com o Entity
Framework.
- Manualmente criando uma classe com
extension methods e implementando
apenas os Endpoints que precisar.
1ªMELHORIA–ORGANIZAÇÃO
#VSSUMMIT
Nesta demonstração vou utilizar o Scaffolding utilizando o Entity Framework
Deveremos definir o nome da classe que irá implementar os endpoints
1ªMELHORIA–ORGANIZAÇÃO
#VSSUMMIT
Vemos que é criada uma classe estática
Com algumas particularidades:
- Ela tem um método que é uma
extensão de “IEndpointRouteBuilder”.
- Ela cria um grupo, que será utilizado
para declaração dos endpoints,
desta forma eles serão agrupados
de acordo com a rota.
- Será inserido no program.cs um
comando para inicialização dos
endpoints.
1ªMELHORIA–ORGANIZAÇÃO
#VSSUMMIT
Então teremos um program.cs muito
mais limpo, concentrando os endpoints
numa classe específica.
2ªMELHORIA–ROUTEGROUPS
#VSSUMMIT
Nas primeiras versões de Minimal Api não tínhamos a possibilidade de utilizar Route Groups, agrupando as
rotas e aplicando configurações que fossem comuns à uma mesma rota.
Agora no .NET 7 já podemos utilizar RouteGroups, mas antes tínhamos que aplicar em cada Map
configurações específicas.
2ªMELHORIA–ROUTEGROUPS
#VSSUMMIT
Agora no .NET 7, foram implementados os Route Groups, onde além de simplificar e não precisar ficar mais
repetindo o nome do endpoint em cada Map, podemos aplicar outras propriedades diretamente ao grupo.
Com isto Tags, Autorização, Filtros e outras funcionalidades ficarão mais fáceis de implementar.
3ªMELHORIA–CONFIGURAÇÕES
#VSSUMMIT
Sempre será necessário realizar a
parametrização da sua aplicação com
configurações distintas para diferentes
Environments: Develop, Production,
Staging.
O .NET já cuida da leitura das suas
configurações diretamente dos arquivos
appsettings.json, sendo a leitura de
acordo com o Environment, então
teremos os
appsettings.Development.json por
exemplo.
E através do padrão IOptions<>
podemos carregar as configurações em
classes que poderão ser utilizadas via
injeção de dependência.
Você deve montar no
appsettings da sua
aplicação a parametrização
baseada na classe que
criou.
3ªMELHORIA–CONFIGURAÇÕES
#VSSUMMIT
Para realizar a leitura da configuração criada, basta inserir no arquivo “program.cs” a linha destacada, onde
é feita leitura do “appsettings” e depois inserida na configuração. Automaticamente a aplicação já fará a
leitura do “environments” para carregar o arquivo “appsettings” correto.
3ªMELHORIA–CONFIGURAÇÕES
#VSSUMMIT
Depois de feito tudo isso, é
só usar a configuração
inserindo via injeção de
dependência.
Isto serve não só para os
endpoints, mas também para
classes de serviço, onde
colocamos em seu construtor.
4ªMELHORIA–INJEÇÃODEDEPENDÊNCIA
#VSSUMMIT
Muitas vezes o projeto começa a crescer e a configuração da injeção de dependência fica muito grande e
confusa, de difícil conferência e assim precisamos organizá-la melhor.
Uma das formas de se fazer é segregar as configurações em arquivos separados e também podemos sem
uso de nada muito sofisticado, e nem bibliotecas de terceiros, fazer um escaneamento das classes sem termos
que informar uma a uma.
Este é um exemplo bem
comum de algo que
acontece na vida real.
Inúmeras linhas para
declarar a injeção de
dependência.
4ªMELHORIA–INJEÇÃODEDEPENDÊNCIA
#VSSUMMIT
Para solucionar podemos criar um “Extension Method” que fará um escaneamento das classes correspondentes
baseado no nome final da classe, pelo parâmetro “classEndWith”.
Eu utilizo isso para classes com finais do nome padronizados, como: ...Service, ...Repository.
4ªMELHORIA–INJEÇÃODEDEPENDÊNCIA
#VSSUMMIT
Desta forma a inicialização ficará muito mais limpa e de fácil interpretação.
Por que passar o Assembly? Por que em muitos casos temos vários projetos na mesma solution, criando
diferentes “assembly”. Então criamos arquivos para injeção dentro de cada projeto.
5ªMELHORIA-LOG
#VSSUMMIT
Sempre que implementamos uma API surge a necessidade de monitorar seu funcionamento, debugar erros,
etc, instrumentá-la para gerar logs que permitam identificar seus pontos de falha ou bugs é essencial.
Podemos realizar a implementação de Logs utilizando a biblioteca Serilog, que permite logarmos em
Arquivo, Console, Email e várias outras formas.
Para adicioná-lo, vamos utilizar as seguintes bibliotecas nuget.
Serilog.AspNetCore
Serilog.Sinks.Console
Serilog.Sinks.File
5ªMELHORIA-LOG
#VSSUMMIT
Depois criaremos um “Extension Method” para realizar a configuração completa do Log
5ªMELHORIA-LOG
#VSSUMMIT
Agora é só implementar na inicialização no program.cs a seguinte linha
builder.ConfigureLogging();
Agora é só utilizar dentro das suas classes e métodos, instrumentando a sua aplicação para os níveis
desejados que podem ser: Trace, Debug, Information, Error, Warning e Critical conforme a necessidade que
tiver para debug.
No exemplo abaixo só será registrado o log caso a configuração do nível seja “Debug”.
5ªMELHORIA-LOG
#VSSUMMIT
Como resultado, seu log vai ficar assim:
Isto vai ajuda-los muito quando necessário obter as informações de tudo que acontece no método que
instrumentou.
Basta mudar no seu appsettings o nível de logging que precisa e debugar a aplicação, em produção,
implemente o nível Warning ou Error e monitore somente o que dá errado.
5ªMELHORIA-LOG
#VSSUMMIT
Ainda se precisar fazer a configuração da sua aplicação para obter log de Request, Response e seus
Headers, pode implementar esta configuração no program.cs.
Pode-se também criar parâmetros no appsettings a fim de realizar a utilização destes logs só quando
precisar, para que não armazene logs desnecessariamente.
Exemplo básico de logs de request e response:
6ªMELHORIA-HEALTHCHECKS
#VSSUMMIT
Como saber se nossa API está de pé? HealthChecks são importantes para monitoramento e verificação do
estado de nossa API.
Basta incluir no program.cs as seguintes instruções:
builder.Services.AddHealthChecks();
app.UseHealthChecks("/health");
Com isto será criado um endpoint para testar se a aplicação está de pé.
Pode-se também implementar pacotes nuget que testam se o banco
de dados está acessível também.
7ªMELHORIA–OUTPUTCACHE
#VSSUMMIT
No .NET 7 foi implementado o recurso de output cache, que permite de forma muito simples realizar a
disponibilização de cache na saída da aplicação, garantindo maior performance e menor utilização de
recursos para dados previamente processados.
Para implementá-lo basta colocar dois comandos na inicialização da sua aplicação:
builder.Services.AddOutputCache(options =>
{
options.DefaultExpirationTimeSpan = TimeSpan.FromSeconds(10);
});
app.UseOutputCache();
No exemplo acima foi definido um tempo de 10 segundos de duração para o cache, mas você pode definí-lo
como quiser.
Além disso, esta implementação precisa que seja feita uma parametrização direta no seu endpoint ou rota.
7ªMELHORIA–OUTPUTCACHE
#VSSUMMIT
Podemos estabelecer duas formas de implementação, default ou através do parâmetro específico, além do
que podemos também estabelecer um tempo diferente do padrão também.
7ªMELHORIA–OUTPUTCACHE
#VSSUMMIT
Para testar basta executar várias vezes e identificar que a data não modifica-se enquanto está no tempo de
salvamento do cache !
Já o segundo exemplo, o cache varia de acordo com o parâmetro utilizado !
8ªMELHORIA–RATELIMIT
#VSSUMMIT
O .NET 7 possui um middleware para limitação da taxa de acesso às API´s, ele é implementado pela
biblioteca Microsoft.AspNetCore.RateLimiting onde podemos limitar a quantidade de requisições que uma
API está apta a aceitar num período de tempo a ser estabelecido.
De acordo com a documentação, temos várias formas de implementar este tipo de limitador, sendo:
- Janela fixa – utiliza uma janela de tempo fixa para controlar as limitações
- Janela deslizante – utiliza uma janela de tempo deslizante, dividindo em segmentos e reciclando
solicitações não utilizadas
- Bucket de Token – similar ao anterior, mas um número fixo de tokens é adicionado a cada período de
reabastecimento.
- Simultaneidade - limita o número de solicitações simultâneas.
Vamos implementar então um limitador de janela fixa somente para demonstrar a possibilidade de
implementação em qualquer aplicação .Net 7.
8ªMELHORIA–RATELIMIT
#VSSUMMIT
Para implementação, basta colocar o código abaixo no program.cs.
E incluir esta linha na parte inferior assim que tiver criado o objeto app
8ªMELHORIA–RATELIMIT
#VSSUMMIT
Após implementar a limitação, fiz 5 requisições para ultrapassar o limite implementado, com isto recebi a
mensagem de erro conforme demonstrado abaixo, com erro 429:
8ªMELHORIA–RATELIMIT
#VSSUMMIT
Neste exemplo, podemos incluir uma fila de espera, onde a requisição não devolve erro caso haja 3
requisições na fila, resultando erro apenas se excederem este limite.
Basta que seja informado o nome da política “period3” no mapeamento do endpoint.
8ªMELHORIA–RATELIMIT
#VSSUMMIT
Executando o exemplo anterior, vemos que o tempo de execução depois de atingir o limite foi bem maior, por
que ela foi colocada na fila e esperou que a janela de execução finalizasse para devolver a resposta.
8ªMELHORIA–RATELIMIT
#VSSUMMIT
E para finalizar para que nossa inicialização não fique desorganizada e cheia de código, vamos aplicar um
extension method para deixar o código limpo no program.cs ficando uma simples linha.
Assim o código fica muito mais legível e
colocamos cada coisa no seu lugar !
Criando uma classe para guardar nossas
extensões de inicialização !
FINALIZANDO
#VSSUMMIT
Com certeza se implementarmos todos estes pontos numa API, teremos uma entrega muito profissional e
pronta para atender à grandes demandas.
Existem muitos outros pontos a se implementar como Autenticação/Autorização, Cors, mas isto não falta
documentação na Web para se pequisar e implementar na sua aplicação.
REFERÊNCIAS
• Rate Limit:
https://blog.maartenballiauw.be/post/2022/09/26/aspnet-core-rate-limiting-middleware.html
https://learn.microsoft.com/pt-br/aspnet/core/performance/rate-limit?view=aspnetcore-7.0
• Cache
https://learn.microsoft.com/en-us/aspnet/core/performance/caching/output?view=aspnetcore-7.0
• Routes
https://renatogroffe.medium.com/novidades-do-net-7-route-groups-para-organiza%C3%A7%C3%A3o-de-endpoints-em-minimal-apis-c78c64b49dfa
https://learn.microsoft.com/pt-br/aspnet/core/fundamentals/minimal-apis/route-handlers?view=aspnetcore-7.0
• Nizzola Publicações
https://marcionizzola.medium.com/
https://linktr.ee/nizzola
•Github do exemplo demonstrado
https://github.com/NIZZOLA/VsSummit2023
#VSSUMMIT
DEMO
#VSSUMMIT
▪ API VS SUMMIT
CONTATOS
#VSSUMMIT
https://linktr.ee/nizzola
MÁRCIO R NIZZOLA
MVP DEVELOPER TECHNOLOGIES
MARCIONIZZOLA@GMAIL.COM
#VSSUMMIT
MUITOOBRIGADO!

Mais conteúdo relacionado

PPTX
Implementando APIs multiplataforma com ASP.NET Core 2.0 - .NET Conf Local 201...
PPTX
Boas práticas na implementação de APIs REST com ASP.NET Core - Outubro-2019
PPTX
Implementando APIs multiplataforma com ASP.NET Core 2.0 - Developers-SP - Out...
PPTX
Revisão de C# 4.0
PPTX
Dicas para uma maior performance em APIs REST - DEVPIRA Festival - Dezembro-2018
PPTX
Dicas para simplificar o desenvolvimento de APIs REST em ASP.NET Core - .NET ...
PDF
DevPira Festival 21 - .NET6 Uma nova forma de construir apis MinimalAPIs
PPTX
Novidades do ASP.NET Core 2.1
Implementando APIs multiplataforma com ASP.NET Core 2.0 - .NET Conf Local 201...
Boas práticas na implementação de APIs REST com ASP.NET Core - Outubro-2019
Implementando APIs multiplataforma com ASP.NET Core 2.0 - Developers-SP - Out...
Revisão de C# 4.0
Dicas para uma maior performance em APIs REST - DEVPIRA Festival - Dezembro-2018
Dicas para simplificar o desenvolvimento de APIs REST em ASP.NET Core - .NET ...
DevPira Festival 21 - .NET6 Uma nova forma de construir apis MinimalAPIs
Novidades do ASP.NET Core 2.1

Semelhante a VSSUMMIT 2023 - Como partir do zero e entregar uma API Profissional com .NET 7 e Minimal Api (20)

PPTX
10 dicas úteis para simplificar o desenvolvimento em ASP.NET Core - ASP.NET C...
PPTX
Boas Práticas em Aplicações na Nuvem: Twelve-Factor App | TDC Connections 2021
PPTX
Dicas para simplificar o desenvolvimento de APIs REST em ASP.NET Core - Arqui...
PDF
Desenvolvimento Client-Side 2016 (BrazilJS)
PDF
Intro aspnet webapi
PPTX
Resumo do TheDeveloperConference 2014 - POA
PPTX
Boas práticas na implementação de APIs REST com ASP.NET Core - Agosto-2019
PPTX
Otimizando seu cenário de APIs
PPTX
Boas Práticas em Aplicações na Nuvem: Twelve-Factor App | MVPConf Latam 2021
PPTX
Dicas para uma maior performance em APIs REST - Renato Groffe
PDF
dotnetConf 2016 Goiânia: .NET Core | ASP.NET Core
PPTX
Dicas para migrar sua aplicação ASP.NET para ASP.NET Core 2.x
PDF
Qualidade com Agilidade para Startups
PPTX
ASP.NET 5 - Novidades do Desenvolvimento Web em .NET
PDF
Aula ASP.NET.pdf whatsap Whatsap pdf.com
PPTX
ASP.Net Performance – A pragmatic approach - Luis Paulino
PPTX
Cloud Native Microservices - Rumo a uma Arquitetura de Microsserviços Nativos...
PPTX
Boas Práticas em Aplicações na Nuvem: Twelve-Factor App - Março-2021
PPTX
The Developers Conference 2014 | Porto Alegre
PPTX
Dicas para uma maior performance em APIs REST - Tech Meetup - Itaú Unibanco -...
10 dicas úteis para simplificar o desenvolvimento em ASP.NET Core - ASP.NET C...
Boas Práticas em Aplicações na Nuvem: Twelve-Factor App | TDC Connections 2021
Dicas para simplificar o desenvolvimento de APIs REST em ASP.NET Core - Arqui...
Desenvolvimento Client-Side 2016 (BrazilJS)
Intro aspnet webapi
Resumo do TheDeveloperConference 2014 - POA
Boas práticas na implementação de APIs REST com ASP.NET Core - Agosto-2019
Otimizando seu cenário de APIs
Boas Práticas em Aplicações na Nuvem: Twelve-Factor App | MVPConf Latam 2021
Dicas para uma maior performance em APIs REST - Renato Groffe
dotnetConf 2016 Goiânia: .NET Core | ASP.NET Core
Dicas para migrar sua aplicação ASP.NET para ASP.NET Core 2.x
Qualidade com Agilidade para Startups
ASP.NET 5 - Novidades do Desenvolvimento Web em .NET
Aula ASP.NET.pdf whatsap Whatsap pdf.com
ASP.Net Performance – A pragmatic approach - Luis Paulino
Cloud Native Microservices - Rumo a uma Arquitetura de Microsserviços Nativos...
Boas Práticas em Aplicações na Nuvem: Twelve-Factor App - Março-2021
The Developers Conference 2014 | Porto Alegre
Dicas para uma maior performance em APIs REST - Tech Meetup - Itaú Unibanco -...
Anúncio

Mais de Dextra Sistemas / Etec Itu (6)

PDF
Desenvolvimento em .NET utilizando Docker - Meetup 8 Itu Developers
PPTX
Usando Docker no desenvolvimento .NET
PPTX
Tdc - Criando uma Minimal API para serviços de Geolocalização com SQL + C#
PPTX
Tdc Future 2021 - simples soluções grandes resultados - Márcio Rogério Nizzola
PPTX
Mvp conf 2021 - Criando uma Minimal API para serviços de Geolocalização com S...
PDF
Os Benefícios dos testes no desenvolvimento de software
Desenvolvimento em .NET utilizando Docker - Meetup 8 Itu Developers
Usando Docker no desenvolvimento .NET
Tdc - Criando uma Minimal API para serviços de Geolocalização com SQL + C#
Tdc Future 2021 - simples soluções grandes resultados - Márcio Rogério Nizzola
Mvp conf 2021 - Criando uma Minimal API para serviços de Geolocalização com S...
Os Benefícios dos testes no desenvolvimento de software
Anúncio

Último (6)

PDF
Dos requisitos ao código: como criar código rastreável em PHP
PDF
Evolução em código: algoritmos genéticos com PHP
DOC
COMO AUTOMATIZR JOGOS SUPER NINTENDO ATRAVES DA PROGRAMAÇÃO
DOC
CODIGO PARA AUTOMATIZAR A JOGABILIDADE SUPER MARIO
PPTX
Curso de Windows 11 resumido na prática.pptx
PDF
apresentacao introducao computacao ead.pdf
Dos requisitos ao código: como criar código rastreável em PHP
Evolução em código: algoritmos genéticos com PHP
COMO AUTOMATIZR JOGOS SUPER NINTENDO ATRAVES DA PROGRAMAÇÃO
CODIGO PARA AUTOMATIZAR A JOGABILIDADE SUPER MARIO
Curso de Windows 11 resumido na prática.pptx
apresentacao introducao computacao ead.pdf

VSSUMMIT 2023 - Como partir do zero e entregar uma API Profissional com .NET 7 e Minimal Api

  • 1. MÁRCIO R. NIZZOLA MVP DEVELOPER TECHNOLOGIES MARCIONIZZOLA@GMAIL.COM Como partir do zero e entregar uma API profissional com .NET 7 e Minimal Api #VSSUMMIT
  • 2. INTRODUÇÃO #VSSUMMIT • O conceito de Minimal API foi introduzido no .NET 6 tornando muito mais simples a implementação de um endpoint dado que anteriormente tínhamos a Controller, que precisava de uma série de configurações específicas. • Além disso, unido ao lançamento deste conceito, o C# 10 mudou também a forma como se inicializa uma aplicação onde agora o program.cs incorporou o conceito “top level statements” (instruções de nível superior) simplificando muito a inicialização da aplicação. Nota: Para quem ainda não utiliza o Visual Studio 2022, estes dois itens não serão interpretados corretamente, caso não tenha a licença, uma recomendação é utilizar o VS Code.
  • 4. OBJETIVO #VSSUMMIT Ao final desta apresentação teremos uma API com: - Utilização de Minimal Api´s - Organização de seus endpoints escritos com conceito Minimal Api - Implementação de Route Groups para melhorar a documentação - Implementação de Configurações personalizadas - Melhoria na injeção de dependência - Implementação de Logging - Implementação de HealthChecks - Implementação de Output Cache - Implementação de Rate Limit
  • 6. CRIAÇÃODAAPIUTILIZANDOOVISUALSTUDIO #VSSUMMIT A partir do Visual Studio 2022 novos checkboxes foram adicionados para selecionar as opções que contemplam: - Usar ou não Controllers (Minimal Api) - Habilitar OpenApi (Swagger) - Utilizar instruções de nível superior
  • 7. NOVOTEMPLATE #VSSUMMIT Podemos destacar alguns detalhes - O resultado é o mesmo e vemos que já tem menos linhas de código. - A declaração do endpoint é feita com um simples comando “app.MapGet” não precisando de arquivo separado como era feito na Controller com uma série de itens obrigatórios. - Esta versão já contempla o Swagger também. Ponto negativo: - Para um endpoint é tudo lindo, mas se tiver mais começa a ficar complexo. - Tem variáveis de negócio e classes no program.cs !
  • 8. 1ªMELHORIA–ORGANIZAÇÃO #VSSUMMIT Para melhor organização podemos criar uma classe com os endpoints separados. Podemos fazer de três formas: - através do famoso “Scaffolding” que pode criar uma classe e já montar todos os métodos “Crud” conectando também ao Entity Framework. - Através do “Scaffolding” mas apenas criando os endpoints para os principais verbos sem conexão com o Entity Framework. - Manualmente criando uma classe com extension methods e implementando apenas os Endpoints que precisar.
  • 9. 1ªMELHORIA–ORGANIZAÇÃO #VSSUMMIT Nesta demonstração vou utilizar o Scaffolding utilizando o Entity Framework Deveremos definir o nome da classe que irá implementar os endpoints
  • 10. 1ªMELHORIA–ORGANIZAÇÃO #VSSUMMIT Vemos que é criada uma classe estática Com algumas particularidades: - Ela tem um método que é uma extensão de “IEndpointRouteBuilder”. - Ela cria um grupo, que será utilizado para declaração dos endpoints, desta forma eles serão agrupados de acordo com a rota. - Será inserido no program.cs um comando para inicialização dos endpoints.
  • 11. 1ªMELHORIA–ORGANIZAÇÃO #VSSUMMIT Então teremos um program.cs muito mais limpo, concentrando os endpoints numa classe específica.
  • 12. 2ªMELHORIA–ROUTEGROUPS #VSSUMMIT Nas primeiras versões de Minimal Api não tínhamos a possibilidade de utilizar Route Groups, agrupando as rotas e aplicando configurações que fossem comuns à uma mesma rota. Agora no .NET 7 já podemos utilizar RouteGroups, mas antes tínhamos que aplicar em cada Map configurações específicas.
  • 13. 2ªMELHORIA–ROUTEGROUPS #VSSUMMIT Agora no .NET 7, foram implementados os Route Groups, onde além de simplificar e não precisar ficar mais repetindo o nome do endpoint em cada Map, podemos aplicar outras propriedades diretamente ao grupo. Com isto Tags, Autorização, Filtros e outras funcionalidades ficarão mais fáceis de implementar.
  • 14. 3ªMELHORIA–CONFIGURAÇÕES #VSSUMMIT Sempre será necessário realizar a parametrização da sua aplicação com configurações distintas para diferentes Environments: Develop, Production, Staging. O .NET já cuida da leitura das suas configurações diretamente dos arquivos appsettings.json, sendo a leitura de acordo com o Environment, então teremos os appsettings.Development.json por exemplo. E através do padrão IOptions<> podemos carregar as configurações em classes que poderão ser utilizadas via injeção de dependência. Você deve montar no appsettings da sua aplicação a parametrização baseada na classe que criou.
  • 15. 3ªMELHORIA–CONFIGURAÇÕES #VSSUMMIT Para realizar a leitura da configuração criada, basta inserir no arquivo “program.cs” a linha destacada, onde é feita leitura do “appsettings” e depois inserida na configuração. Automaticamente a aplicação já fará a leitura do “environments” para carregar o arquivo “appsettings” correto.
  • 16. 3ªMELHORIA–CONFIGURAÇÕES #VSSUMMIT Depois de feito tudo isso, é só usar a configuração inserindo via injeção de dependência. Isto serve não só para os endpoints, mas também para classes de serviço, onde colocamos em seu construtor.
  • 17. 4ªMELHORIA–INJEÇÃODEDEPENDÊNCIA #VSSUMMIT Muitas vezes o projeto começa a crescer e a configuração da injeção de dependência fica muito grande e confusa, de difícil conferência e assim precisamos organizá-la melhor. Uma das formas de se fazer é segregar as configurações em arquivos separados e também podemos sem uso de nada muito sofisticado, e nem bibliotecas de terceiros, fazer um escaneamento das classes sem termos que informar uma a uma. Este é um exemplo bem comum de algo que acontece na vida real. Inúmeras linhas para declarar a injeção de dependência.
  • 18. 4ªMELHORIA–INJEÇÃODEDEPENDÊNCIA #VSSUMMIT Para solucionar podemos criar um “Extension Method” que fará um escaneamento das classes correspondentes baseado no nome final da classe, pelo parâmetro “classEndWith”. Eu utilizo isso para classes com finais do nome padronizados, como: ...Service, ...Repository.
  • 19. 4ªMELHORIA–INJEÇÃODEDEPENDÊNCIA #VSSUMMIT Desta forma a inicialização ficará muito mais limpa e de fácil interpretação. Por que passar o Assembly? Por que em muitos casos temos vários projetos na mesma solution, criando diferentes “assembly”. Então criamos arquivos para injeção dentro de cada projeto.
  • 20. 5ªMELHORIA-LOG #VSSUMMIT Sempre que implementamos uma API surge a necessidade de monitorar seu funcionamento, debugar erros, etc, instrumentá-la para gerar logs que permitam identificar seus pontos de falha ou bugs é essencial. Podemos realizar a implementação de Logs utilizando a biblioteca Serilog, que permite logarmos em Arquivo, Console, Email e várias outras formas. Para adicioná-lo, vamos utilizar as seguintes bibliotecas nuget. Serilog.AspNetCore Serilog.Sinks.Console Serilog.Sinks.File
  • 21. 5ªMELHORIA-LOG #VSSUMMIT Depois criaremos um “Extension Method” para realizar a configuração completa do Log
  • 22. 5ªMELHORIA-LOG #VSSUMMIT Agora é só implementar na inicialização no program.cs a seguinte linha builder.ConfigureLogging(); Agora é só utilizar dentro das suas classes e métodos, instrumentando a sua aplicação para os níveis desejados que podem ser: Trace, Debug, Information, Error, Warning e Critical conforme a necessidade que tiver para debug. No exemplo abaixo só será registrado o log caso a configuração do nível seja “Debug”.
  • 23. 5ªMELHORIA-LOG #VSSUMMIT Como resultado, seu log vai ficar assim: Isto vai ajuda-los muito quando necessário obter as informações de tudo que acontece no método que instrumentou. Basta mudar no seu appsettings o nível de logging que precisa e debugar a aplicação, em produção, implemente o nível Warning ou Error e monitore somente o que dá errado.
  • 24. 5ªMELHORIA-LOG #VSSUMMIT Ainda se precisar fazer a configuração da sua aplicação para obter log de Request, Response e seus Headers, pode implementar esta configuração no program.cs. Pode-se também criar parâmetros no appsettings a fim de realizar a utilização destes logs só quando precisar, para que não armazene logs desnecessariamente. Exemplo básico de logs de request e response:
  • 25. 6ªMELHORIA-HEALTHCHECKS #VSSUMMIT Como saber se nossa API está de pé? HealthChecks são importantes para monitoramento e verificação do estado de nossa API. Basta incluir no program.cs as seguintes instruções: builder.Services.AddHealthChecks(); app.UseHealthChecks("/health"); Com isto será criado um endpoint para testar se a aplicação está de pé. Pode-se também implementar pacotes nuget que testam se o banco de dados está acessível também.
  • 26. 7ªMELHORIA–OUTPUTCACHE #VSSUMMIT No .NET 7 foi implementado o recurso de output cache, que permite de forma muito simples realizar a disponibilização de cache na saída da aplicação, garantindo maior performance e menor utilização de recursos para dados previamente processados. Para implementá-lo basta colocar dois comandos na inicialização da sua aplicação: builder.Services.AddOutputCache(options => { options.DefaultExpirationTimeSpan = TimeSpan.FromSeconds(10); }); app.UseOutputCache(); No exemplo acima foi definido um tempo de 10 segundos de duração para o cache, mas você pode definí-lo como quiser. Além disso, esta implementação precisa que seja feita uma parametrização direta no seu endpoint ou rota.
  • 27. 7ªMELHORIA–OUTPUTCACHE #VSSUMMIT Podemos estabelecer duas formas de implementação, default ou através do parâmetro específico, além do que podemos também estabelecer um tempo diferente do padrão também.
  • 28. 7ªMELHORIA–OUTPUTCACHE #VSSUMMIT Para testar basta executar várias vezes e identificar que a data não modifica-se enquanto está no tempo de salvamento do cache ! Já o segundo exemplo, o cache varia de acordo com o parâmetro utilizado !
  • 29. 8ªMELHORIA–RATELIMIT #VSSUMMIT O .NET 7 possui um middleware para limitação da taxa de acesso às API´s, ele é implementado pela biblioteca Microsoft.AspNetCore.RateLimiting onde podemos limitar a quantidade de requisições que uma API está apta a aceitar num período de tempo a ser estabelecido. De acordo com a documentação, temos várias formas de implementar este tipo de limitador, sendo: - Janela fixa – utiliza uma janela de tempo fixa para controlar as limitações - Janela deslizante – utiliza uma janela de tempo deslizante, dividindo em segmentos e reciclando solicitações não utilizadas - Bucket de Token – similar ao anterior, mas um número fixo de tokens é adicionado a cada período de reabastecimento. - Simultaneidade - limita o número de solicitações simultâneas. Vamos implementar então um limitador de janela fixa somente para demonstrar a possibilidade de implementação em qualquer aplicação .Net 7.
  • 30. 8ªMELHORIA–RATELIMIT #VSSUMMIT Para implementação, basta colocar o código abaixo no program.cs. E incluir esta linha na parte inferior assim que tiver criado o objeto app
  • 31. 8ªMELHORIA–RATELIMIT #VSSUMMIT Após implementar a limitação, fiz 5 requisições para ultrapassar o limite implementado, com isto recebi a mensagem de erro conforme demonstrado abaixo, com erro 429:
  • 32. 8ªMELHORIA–RATELIMIT #VSSUMMIT Neste exemplo, podemos incluir uma fila de espera, onde a requisição não devolve erro caso haja 3 requisições na fila, resultando erro apenas se excederem este limite. Basta que seja informado o nome da política “period3” no mapeamento do endpoint.
  • 33. 8ªMELHORIA–RATELIMIT #VSSUMMIT Executando o exemplo anterior, vemos que o tempo de execução depois de atingir o limite foi bem maior, por que ela foi colocada na fila e esperou que a janela de execução finalizasse para devolver a resposta.
  • 34. 8ªMELHORIA–RATELIMIT #VSSUMMIT E para finalizar para que nossa inicialização não fique desorganizada e cheia de código, vamos aplicar um extension method para deixar o código limpo no program.cs ficando uma simples linha. Assim o código fica muito mais legível e colocamos cada coisa no seu lugar ! Criando uma classe para guardar nossas extensões de inicialização !
  • 35. FINALIZANDO #VSSUMMIT Com certeza se implementarmos todos estes pontos numa API, teremos uma entrega muito profissional e pronta para atender à grandes demandas. Existem muitos outros pontos a se implementar como Autenticação/Autorização, Cors, mas isto não falta documentação na Web para se pequisar e implementar na sua aplicação.
  • 36. REFERÊNCIAS • Rate Limit: https://blog.maartenballiauw.be/post/2022/09/26/aspnet-core-rate-limiting-middleware.html https://learn.microsoft.com/pt-br/aspnet/core/performance/rate-limit?view=aspnetcore-7.0 • Cache https://learn.microsoft.com/en-us/aspnet/core/performance/caching/output?view=aspnetcore-7.0 • Routes https://renatogroffe.medium.com/novidades-do-net-7-route-groups-para-organiza%C3%A7%C3%A3o-de-endpoints-em-minimal-apis-c78c64b49dfa https://learn.microsoft.com/pt-br/aspnet/core/fundamentals/minimal-apis/route-handlers?view=aspnetcore-7.0 • Nizzola Publicações https://marcionizzola.medium.com/ https://linktr.ee/nizzola •Github do exemplo demonstrado https://github.com/NIZZOLA/VsSummit2023 #VSSUMMIT
  • 39. MÁRCIO R NIZZOLA MVP DEVELOPER TECHNOLOGIES MARCIONIZZOLA@GMAIL.COM #VSSUMMIT MUITOOBRIGADO!