ASP .NET Core - Minimal API com PostgreSQL e EF Core - III
Neste artigo veremos como criar uma API usando a abordagem das Minimal APIs para realizar um CRUD básico em um banco de dados PostgreSQL usando o EF Core. |
Continuando o artigo anterior vamos agora organizar o código da classe Program agrupando os recursos por responsabilidades com o objetivo de facilitar a manutenção.
Para realizar a separação por responsabilidades vamos criar uma pasta Extensions no projeto e a seguir vamos criar duas classes estáticas onde vamos definir métodos de extensão.
1- Na classe estática ApplicationBuilderExtensions vamos definir os seguintes métodos de extensão relacionados com registro do pipeline HTTP
namespace CatalogoApi.Extensions;
public static class ApplicationBuilderExtensions public static IApplicationBuilder UseSwaggerEndpoints(this IApplicationBuilder app) return app; |
2- Na classe estática ServiceCollectionExtensions vamos definir os seguintes métodos de extensão relacionados com a inclusão dos serviços no contâiner DI nativo:
using CatalogoApi.Context; using CatalogoApi.Services; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Http.Json; using Microsoft.EntityFrameworkCore; using Microsoft.IdentityModel.Tokens; using Microsoft.OpenApi.Models; using System.Text; using System.Text.Json.Serialization; namespace CatalogoApi.Extensions; public static class ServiceCollectionExtensions public static IServiceCollection AddSwagger(this IServiceCollection services) public static IServiceCollection AddJsonOptions(this IServiceCollection services) public static WebApplicationBuilder AddAutenticationJwt(this WebApplicationBuilder builder) ValidIssuer = builder.Configuration["Jwt:Issuer"], builder.Services.AddAuthorization(); return builder; public static WebApplicationBuilder AddPersistence(this WebApplicationBuilder builder) builder.Services.AddDbContext<AppDbContext>(options => builder.Services.AddSingleton<ITokenService>(new TokenService()); return builder; |
A seguir vamos criar a pasta ApiEndpoints onde vamos criar as classes CategoriasEndpoints, ProdutosEndpoints e AutenticacaoEndpoints que irão definir os métodos de extensão para agrupar os respectivos endpoints para Categorias e Produtos e definir o endpoint para fazer o Login do usuário usando o nome e senha padrão.
1- CategoriasEndpoints
using CatalogoApi.Context; using CatalogoApi.Models; using Microsoft.EntityFrameworkCore; namespace CatalogoApi.ApiEndpoints; public static class CategoriasEndpoints return Results.Created($"/categorias/{categoria.CategoriaId}", categoria); app.MapGet("/categorias", async (AppDbContext db) => await db.Categorias.ToListAsync()); app.MapPut("/categorias/{id:int}", async (int id, Categoria categoria, AppDbContext db) => var categoriaDB = await db.Categorias.FindAsync(id); if (categoriaDB is null) return Results.NotFound(); categoriaDB.Nome = categoria.Nome; await db.SaveChangesAsync(); app.MapDelete("/categorias/{id:int}", async (int id, AppDbContext db) => var categoria = await db.Categorias.FindAsync(id); if (categoria is not null) |
2- ProdutosEndpoints
using CatalogoApi.Context; using CatalogoApi.Models; using Microsoft.EntityFrameworkCore; namespace CatalogoApi.ApiEndpoints; public static class ProdutosEndpoints return Results.Created($"/produtos/{produto.ProdutoId}", produto); app.MapGet("/produtos", async (AppDbContext db) => await db.Produtos.ToListAsync()); app.MapGet("/produtos/{id:int}", async (int id, AppDbContext db) => app.MapPut("/produtos/{id:int}", async (int id, Produto produto, AppDbContext db) => var produtoDB = await db.Produtos.FindAsync(id); if (produtoDB is null) return Results.NotFound(); produtoDB.Nome = produto.Nome; await db.SaveChangesAsync(); app.MapDelete("/produtos/{id:int}", async (int id, AppDbContext db) => if (produto is not null) return Results.NoContent(); }); |
3- AutenticacaoEndpoints
using CatalogoApi.Models; using CatalogoApi.Services; using Microsoft.AspNetCore.Authorization;
namespace CatalogoApi.ApiEndpoints } |
Agora podemos reorganizar e refatorar o código da classe Program que ficará assim:
using CatalogoApi.ApiEndpoints; using CatalogoApi.Extensions; var builder = WebApplication.CreateBuilder(args); builder.AddSwagger(); var app = builder.Build(); app.MapAutenticacaoEndpoints(); var environment = app.Environment; app app.UseAuthentication(); app.Run(); |
Temos assim um código mais conciso e organizado facilitando a manutenção pelo agrupamento das responsabilidades.
Executando o projeto teremos o resultado:
Pegue o projeto completo aqui : CatalogoApi_Final_Jwt.zip
"Portanto, lembrai-vos de que vós noutro tempo éreis
gentios na carne, e chamados incircuncisão pelos que na carne se chamam
circuncisão feita pela mão dos homens;
Que naquele tempo estáveis sem Cristo, separados da comunidade de Israel, e
estranhos às alianças da promessa, não tendo esperança, e sem Deus no
mundo."
Efésios 2:11,12
Referências:
ASP .NET Core - Implementando a segurança com
ASP.NET Core MVC - Criando um Dashboard .
C# - Gerando QRCode - Macoratti
ASP .NET - Gerando QRCode com a API do Google
ASP .NET Core 2.1 - Como customizar o Identity
Usando o ASP .NET Core Identity - Macoratti
ASP .NET Core - Apresentando o IdentityServer4
ASP .NET Core 3.1 - Usando Identity de cabo a rabo