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

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

Dev401 novos recursos do microsoft visual basic 2010
Dev401 novos recursos do microsoft visual basic 2010Dev401 novos recursos do microsoft visual basic 2010
Dev401 novos recursos do microsoft visual basic 2010
Alexandre Tarifa
 
Spring & Struts
Spring & StrutsSpring & Struts
Spring & Struts
eduan
 
Trabalhando Análise Qualitativa em seu Aplicativo Android
Trabalhando Análise Qualitativa em seu Aplicativo AndroidTrabalhando Análise Qualitativa em seu Aplicativo Android
Trabalhando Análise Qualitativa em seu Aplicativo Android
Vinícius Thiengo
 
ld0mg1hrlhzbyvgfiyyq-signature-d9919623d100cd87ad7553e4c50163aa9329a439464540...
ld0mg1hrlhzbyvgfiyyq-signature-d9919623d100cd87ad7553e4c50163aa9329a439464540...ld0mg1hrlhzbyvgfiyyq-signature-d9919623d100cd87ad7553e4c50163aa9329a439464540...
ld0mg1hrlhzbyvgfiyyq-signature-d9919623d100cd87ad7553e4c50163aa9329a439464540...
Antonio Lobato
 
Integração contínua - Prática de desenvolvimento
Integração contínua - Prática de desenvolvimentoIntegração contínua - Prática de desenvolvimento
Integração contínua - Prática de desenvolvimento
Mario Mendonça
 
Integração Contínua
Integração ContínuaIntegração Contínua
Integração Contínua
Jackson Veroneze
 
Guiao demotecnica
Guiao demotecnicaGuiao demotecnica
Guiao demotecnica
Silvio Dias
 
Guião demotécnica
Guião demotécnicaGuião demotécnica
Guião demotécnica
Silvio Dias
 
Infoeste 2014 - Desenvolvimento de um CMS com Codeigniter Framework(PHP)
Infoeste 2014 - Desenvolvimento de um CMS com Codeigniter Framework(PHP)Infoeste 2014 - Desenvolvimento de um CMS com Codeigniter Framework(PHP)
Infoeste 2014 - Desenvolvimento de um CMS com Codeigniter Framework(PHP)
Rafael Oliveira
 
Preparar o ambiente para desenvolvimento angular
Preparar o ambiente para desenvolvimento angularPreparar o ambiente para desenvolvimento angular
Preparar o ambiente para desenvolvimento angular
Nize Costa
 
Produtividade infinito e além com We.js
Produtividade infinito e além com We.jsProdutividade infinito e além com We.js
Produtividade infinito e além com We.js
Alberto Souza
 
Web Services
Web ServicesWeb Services
Web Services
Igor Gonalves
 
Introdução à Programação Web com Angular
Introdução à Programação Web com AngularIntrodução à Programação Web com Angular
Introdução à Programação Web com Angular
Elmano Cavalcanti
 
Slide 02 introdução ao code igniter, utilização do bootstrap
Slide 02   introdução ao code igniter, utilização do bootstrap Slide 02   introdução ao code igniter, utilização do bootstrap
Slide 02 introdução ao code igniter, utilização do bootstrap
Raniere de Lima
 
Keynote Visual Studio Summit 2016
Keynote Visual Studio Summit 2016Keynote Visual Studio Summit 2016
Keynote Visual Studio Summit 2016
Ramon Durães
 
T@rget trust asp.net avançado
T@rget trust   asp.net avançadoT@rget trust   asp.net avançado
T@rget trust asp.net avançado
Targettrust
 
Gsp313 desafio selo_01
Gsp313 desafio selo_01Gsp313 desafio selo_01
Gsp313 desafio selo_01
GestoFinanceiraFatec
 
Nao sensivel
Nao sensivelNao sensivel
Nao sensivel
GestoFinanceiraFatec
 
Mvc delphi
Mvc delphiMvc delphi
Tendências e Dicas para o Desenvolvimento de Software
Tendências e Dicas para o Desenvolvimento de SoftwareTendências e Dicas para o Desenvolvimento de Software
Tendências e Dicas para o Desenvolvimento de Software
Norberto Santos
 

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

Dev401 novos recursos do microsoft visual basic 2010
Dev401 novos recursos do microsoft visual basic 2010Dev401 novos recursos do microsoft visual basic 2010
Dev401 novos recursos do microsoft visual basic 2010
 
Spring & Struts
Spring & StrutsSpring & Struts
Spring & Struts
 
Trabalhando Análise Qualitativa em seu Aplicativo Android
Trabalhando Análise Qualitativa em seu Aplicativo AndroidTrabalhando Análise Qualitativa em seu Aplicativo Android
Trabalhando Análise Qualitativa em seu Aplicativo Android
 
ld0mg1hrlhzbyvgfiyyq-signature-d9919623d100cd87ad7553e4c50163aa9329a439464540...
ld0mg1hrlhzbyvgfiyyq-signature-d9919623d100cd87ad7553e4c50163aa9329a439464540...ld0mg1hrlhzbyvgfiyyq-signature-d9919623d100cd87ad7553e4c50163aa9329a439464540...
ld0mg1hrlhzbyvgfiyyq-signature-d9919623d100cd87ad7553e4c50163aa9329a439464540...
 
Integração contínua - Prática de desenvolvimento
Integração contínua - Prática de desenvolvimentoIntegração contínua - Prática de desenvolvimento
Integração contínua - Prática de desenvolvimento
 
Integração Contínua
Integração ContínuaIntegração Contínua
Integração Contínua
 
Guiao demotecnica
Guiao demotecnicaGuiao demotecnica
Guiao demotecnica
 
Guião demotécnica
Guião demotécnicaGuião demotécnica
Guião demotécnica
 
Infoeste 2014 - Desenvolvimento de um CMS com Codeigniter Framework(PHP)
Infoeste 2014 - Desenvolvimento de um CMS com Codeigniter Framework(PHP)Infoeste 2014 - Desenvolvimento de um CMS com Codeigniter Framework(PHP)
Infoeste 2014 - Desenvolvimento de um CMS com Codeigniter Framework(PHP)
 
Preparar o ambiente para desenvolvimento angular
Preparar o ambiente para desenvolvimento angularPreparar o ambiente para desenvolvimento angular
Preparar o ambiente para desenvolvimento angular
 
Produtividade infinito e além com We.js
Produtividade infinito e além com We.jsProdutividade infinito e além com We.js
Produtividade infinito e além com We.js
 
Web Services
Web ServicesWeb Services
Web Services
 
Introdução à Programação Web com Angular
Introdução à Programação Web com AngularIntrodução à Programação Web com Angular
Introdução à Programação Web com Angular
 
Slide 02 introdução ao code igniter, utilização do bootstrap
Slide 02   introdução ao code igniter, utilização do bootstrap Slide 02   introdução ao code igniter, utilização do bootstrap
Slide 02 introdução ao code igniter, utilização do bootstrap
 
Keynote Visual Studio Summit 2016
Keynote Visual Studio Summit 2016Keynote Visual Studio Summit 2016
Keynote Visual Studio Summit 2016
 
T@rget trust asp.net avançado
T@rget trust   asp.net avançadoT@rget trust   asp.net avançado
T@rget trust asp.net avançado
 
Gsp313 desafio selo_01
Gsp313 desafio selo_01Gsp313 desafio selo_01
Gsp313 desafio selo_01
 
Nao sensivel
Nao sensivelNao sensivel
Nao sensivel
 
Mvc delphi
Mvc delphiMvc delphi
Mvc delphi
 
Tendências e Dicas para o Desenvolvimento de Software
Tendências e Dicas para o Desenvolvimento de SoftwareTendências e Dicas para o Desenvolvimento de Software
Tendências e Dicas para o Desenvolvimento de Software
 

Mais de Dextra Sistemas / Etec Itu

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

Mais de Dextra Sistemas / Etec Itu (6)

Desenvolvimento em .NET utilizando Docker - Meetup 8 Itu Developers
Desenvolvimento em .NET utilizando Docker - Meetup 8 Itu DevelopersDesenvolvimento em .NET utilizando Docker - Meetup 8 Itu Developers
Desenvolvimento em .NET utilizando Docker - Meetup 8 Itu Developers
 
Usando Docker no desenvolvimento .NET
Usando Docker no desenvolvimento .NETUsando Docker no desenvolvimento .NET
Usando Docker no desenvolvimento .NET
 
Tdc - Criando uma Minimal API para serviços de Geolocalização com SQL + C#
Tdc - Criando uma Minimal API para serviços de Geolocalização com SQL + C#Tdc - Criando uma Minimal API para serviços de Geolocalização com SQL + C#
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
Tdc Future 2021 - simples soluções grandes resultados - Márcio Rogério NizzolaTdc Future 2021 - simples soluções grandes resultados - Márcio Rogério Nizzola
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...
Mvp conf 2021 - Criando uma Minimal API para serviços de Geolocalização com S...Mvp conf 2021 - Criando uma Minimal API para serviços de Geolocalização com S...
Mvp conf 2021 - Criando uma Minimal API para serviços de Geolocalização com S...
 
Os Benefícios dos testes no desenvolvimento de software
Os Benefícios dos testes no desenvolvimento de softwareOs Benefícios dos testes no desenvolvimento de software
Os Benefícios dos testes no desenvolvimento de software
 

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!