NET 6 - Migrando para ASP .NET Core 6 - II


Hoje vou continuar a apresentar um roteiro básico de migração para ASP .NET Core no NET 6.

Continuando o artigo anterior veremos o código de migração necessário para realizar algumas tarefas que foram afetadas pelos novos recursos do .NET 6.

1- Incluindo um middleware

.NET 5

public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
        app.UseStaticFiles();
    }
}

.NET 6

var builder = WebApplication.CreateBuilder(args);

var app = builder.Build();

app.UseStaticFiles();

app.Run();

2- Adicionar novas rotas

.NET 5

public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
        app.UseRouting();

        app.UseEndpoints(endpoints =>
        {
                 endpoints.MapGet("/", () => "Hello World");
        });
    }
}

.NET 6

var builder = WebApplication.CreateBuilder(args);

var app = builder.Build();

app.MapGet("/", () => "Hello World");

app.Run();

No .NET 6, as rotas podem ser adicionadas diretamente ao aplicativo Web sem uma chamada explícita para UseEndpoints.

As rotas adicionadas diretamente ao aplicativo Web serão executadas no final do pipeline.

3- Alterar a raiz do conteúdo, o nome do aplicativo e o ambiente

.NET 5

public static IHostBuilder CreateHostBuilder(string[] args) =>
   Host.CreateDefaultBuilder(args)
     .UseContentRoot(Directory.GetCurrentDirectory())
     .UseEnvironment(Environments.Staging)
     .ConfigureWebHostDefaults(webBuilder =>
     {
         webBuilder.UseStartup<Startup>()
               .UseSetting(WebHostDefaults.ApplicationKey, typeof(Program).Assembly.FullName);
    });

.NET 6

var builder = WebApplication.CreateBuilder(new WebApplicationOptions
{
    ApplicationName = typeof(Program).Assembly.FullName,
    ContentRootPath = Directory.GetCurrentDirectory(),
    EnvironmentName = Environments.Staging

});

Console.WriteLine($"Application Name: {builder.Environment.ApplicationName}");
Console.WriteLine($"Environment Name: {builder.Environment.EnvironmentName}");
Console.WriteLine($"ContentRoot Path: {builder.Environment.ContentRootPath}");

var app = builder.Build();

4- Adicionar provedores de configuração

.NET 5

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration(config =>
        {
            config.AddIniFile("appsettings.ini");
        })
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });

.NET 6

var builder = WebApplication.CreateBuilder(args);

builder.Configuration.AddIniFile("appsettings.ini");

var app = builder.Build();

5- Adicionar provedores de logging

.NET 5

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureLogging(logging =>
        {
            logging.AddJsonConsole();
        })
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });

.NET 6

var builder = WebApplication.CreateBuilder(args);

// Configure JSON logging para o  console
builder.Logging.AddJsonConsole();

var app = builder.Build();

6- Adicionar novos serviços

.NET 5

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // Adiciona o serviço memory cache
        services.AddMemoryCache();

        // Adiciona um serviço customizado
        services.AddScoped<ITodoRepository, TodoRepository>();
    }
}

.NET 6

  var builder = WebApplication.CreateBuilder(args);

   // Adiciona o serviço memory cache
  builder.Services.AddMemoryCache();

  // Adiciona um serviço customizado
  builder.Services.AddScoped<ITodoRepository, TodoRepository>();

  var app = builder.Build();

7- Customizando o IHostBuilder

.NET 5

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureHostOptions(o => o.ShutdownTimeout = TimeSpan.FromSeconds(30));
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });

Os métodos de extensão existentes no IHostBuilder podem ser acessados usando a propriedade Host..

.NET 6

var builder = WebApplication.CreateBuilder(args);

// Aguarda 30 seegundos para shutdown
builder.Host.ConfigureHostOptions(o => o.ShutdownTimeout = TimeSpan.FromSeconds(30));

var app = builder.Build();

8- Customizando o IWebHostBuilder

.NET 5

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
           // altera a implementação de HTTP server para ser baseada em HTTP.sys
            webBuilder.UseHttpSys()
                      .UseStartup<Startup>();
        });

Os métodos de extensão existentes no IWebHostBuilder podem ser acessados usando a propriedade WebHost.

.NET 6

var builder = WebApplication.CreateBuilder(args);

// altera a implementação de HTTP server para ser baseada em HTTP.sys
builder.WebHost.UseHttpSys();

var app = builder.Build();

9- Alterando a raiz da web

Por padrão, a raiz da web é relativa à raiz do conteúdo na pasta wwwroot. É aqui que o middleware de arquivos estáticos espera encontrar arquivos estáticos. Você pode alterar isso usando o método UseWebRoot na propriedade WebHost:

.NET 5

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
           // Procura arquivos estaticos em  webroot
            webBuilder.UseWebRoot("webroot")
                      .UseStartup<Startup>();
        });

.NET 6

var builder = WebApplication.CreateBuilder(args);

// Procura arquivos estaticos em  webroot
builder.WebHost.UseWebRoot("webroot");

var app = builder.Build();

10- Acessando serviços adicionais

No método Startup.Configure você pode injetar qualquer serviço adicionado via IServiceCollection.

.NET 5

public class Startup
{
    // Use este método para adicionar serviços no contiainer.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton<IService, Service>();
    }

    // Qualquer coisa adicionada à coleção de serviço pode ser injetada no Configure
    public void Configure(IApplicationBuilder app, 
                          IWebHostEnvironment env,
                          IHostApplicationLifetime lifetime,
                          IService service,
                          ILogger<Startup> logger)
    {
        lifetime.ApplicationStarted.Register(() => 
            logger.LogInformation($"A aplicação {env.ApplicationName} iniciou no serviço {service}"));
    }
}

.NET 6

No .NET 6, existem alguns serviços comuns disponíveis como propriedades de nível superior em WebApplication e serviços adicionais precisam ser resolvidos manualmente no IServiceProvider por meio de WebApplication.Services.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddSingleton<IService, Service>();

var app = builder.Build();

IService service = app.Services.GetRequiredService<IService>();

ILogger logger = app.Logger;
IHostApplicationLifetime lifetime = app.Lifetime;
IWebHostEnvironment env = app.Environment;


lifetime.ApplicationStarted.Register(() =>
      logger.LogInformation($"A aplicação {env.ApplicationName} iniciou no serviço {service}"));

app.Run();

E estamos conversados...

"Quando eu disse: O meu pé vacila; a tua benignidade, Senhor, me susteve."
Salmos 94:18

Referências:


José Carlos Macoratti