ASP.NET Core - Mantendo o Startup leve e limpo
Que tal manter a classe Startup do seu projeto leve e limpa . |
A partir do .NET 6.0 os projetos criados usando os templates do VS 2022 não possuem mais a classe Startup. A inicialização e configuração é feita na classe Program.
Isso não quer dizer que a classe Startup não possa ser usada em seus projetos. Na verdade ela continua sendo suportada no NET 6.0 por uma questão de compatibilidade com os projetos das versões anteriores.
A classe Startup da uma aplicação ASP .NET Core é usada para registrar serviços, repositórios, dependências e fazer a inicialização da aplicação.
Dependendo do projeto pode ocorrer de haver muitas dependências e serviços a serem registradas e assim a classe Startup tende a crescer com muito código definido nos métodos ConfigureServices() e Configure().
E porque você deveria se importar com isso ?
Vou listar alguns motivos:
Com isso em mente vejamos a seguir como manter a classe Startup mais limpa e leve.
Vou apresentar a seguir a classe Startup de um projeto em camadas contendo muito código que será o nosso ponto de partida.
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using API.Middleware; using AutoMapper; using Core.Repositories; using Core.Services; using Core.UnitOfWork; using Data; using Data.Repositories; using Data.UnitOfWork; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Service.Services; using Microsoft.OpenApi.Models; using minhaapi.Swagger; namespace API public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) services.AddDbContext<AppDbContext>(options => { services.AddAuthorization(); services.AddSwaggerGen(options => options.AddSecurityDefinition("My Security Definition", new OpenApiSecurityScheme var filePath = Path.Combine(PlatformServices.Default.Application.ApplicationBasePath, "my-fancy-api.xml"); options.IncludeXmlComments(filePath); public void Configure(IApplicationBuilder app, IWebHostEnvironment env) app.UseRouting(); app.UseAuthorization(); app.UseMiddleware<PerformanceMiddleware>(); app.UseEndpoints(endpoints => app.UseSwaggerUI(options => { |
Este arquivo até que não esta muito grande, mas já dá para ter uma idéia de que, a medida que mais código for acrescentado ao arquivo mais difícil de manter e entender ele vai ficar.
Podemos então tentar diminuir a quantidade de código neste arquivo.
Mas como fazer isso ?
Usando métodos de extensão
Podemos usar métodos de extensão para tornar o arquivo Startup mais enxuto.
Usando métodos de extensão podemos 'adicionar' métodos a tipos sem criar um novo tipo derivado, nem ter que recompilar ou modificar o tipo original;.
Podemos criar métodos de extensão separados para ter funcionalidades específicas, e assim, para o nosso caso, podemos criar métodos de extensão para :
E ao final, no arquivo Startup, fazemos a chamada a cada um dos métodos de extensão criados.
Para isso podemos criar em cada projeto uma classe Startup e a seguir criar métodos de extensão para a interface IServiceCollection.
Vamos ao trabalho...
1- Método de extensão ConfigureAppRepositories para registrar os repositórios e dependências
using Microsoft.EntityCore; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using App.Repositories.Database; using App.Models.Configuration; namespace App.Repositories
|
2- Método de extensão ConfigureAppServices para registrar os serviços
using System; using AutoMapper; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; namespace App.Services { public static class Startup
|
3- Método de extensão ConfigureAppSwagger para configurar o Swagger
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.OpenApi.Models; using minhaapi.Swagger; namespace API.Infrastructure
options.AddSecurityDefinition("My Security Definition", new OpenApiSecurityScheme { |
4 - Método de extensão ConfigureAppAuthentication para configurar a autenticação
public static class AppAuthentication { public static void ConfigureAppAuthentication(this IServiceCollection services) { services.AddAuthentication("Bearer") .AddIdentityServerAuthentication(options => { options.Authority = "https://localhost:44306"; options.RequireHttpsMetadata = false; options.ApiName = "my-api"; });
services.AddAuthorization(); |
Com isso temos 4 métodos de extensão que podemos usar no arquivo Startup do projeto. Fazendo isso iremos obter o resultado abaixo:
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using API.Middleware; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using App.Services; using App.Repositories; using App.Infrastructure. namespace API public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) public void Configure(IApplicationBuilder app, IWebHostEnvironment env) app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => app.UseSwaggerUI(options => { |
Temos agora um arquivo Startup mais enxuto com um menor número de instruções using para definir os namespaces e estamos separando as responsabilidades em arquivos distintos.
Uma solução simples mas eficiente.
E estamos conversados...
"Louvai ao SENHOR, porque ele é bom, porque a sua
benignidade dura para sempre."
Salmos 118:1
Referências:
ASP .NET Core 2 - MiniCurso Básico
ASP .NET Core MVC - CRUD básico com ADO .NET
ASP .NET Core - Implementando a segurança com
ASP .NET Core - Iniciando com ASP .NET Core MVC e
ASP .NET Core MVC - Criando um site com MySql e EF
ASP .NET Core - Gerenciador de Despesas Pessoais com
Minicurso ASP .NET Core 2.0 - Apresentando MVC - YouTube
ASP .NET Core - Configurando o ambiente de .
ASP .NET Core e EF Core - Configurando o ambiente
ASP .NET Core - Como configurar o AutoMapper