DEV Community

Cover image for C#10 e ASP.NET 6, oque esperar dessa dupla?
Lucas Paes
Lucas Paes

Posted on • Updated on

C#10 e ASP.NET 6, oque esperar dessa dupla?

A Microsoft já anunciou que o lançamento do .Net6 está previsto para novembro de 2021, ou seja, para o próximo mês (ebaaa! 😊), pretendendo lançar uma nova versão todo ano nesta mesma data, como pode ser observado no cronograma abaixo.

Cronograma de lançamento .Net

Por conta dessa constante inovação da plataforma a empresa tende a realizar "poucas mudanças" e continuar com o suporte LTS de três anos, possibilitando migrações continuas de seus usuários para as novas atualizações de maneira mais fácil.

Mais informações: Microsoft: Política de suporte .NET

> Ok, mas cadê as novidades? 🤔

Alguns dos principais pontos que chegaram com a nova versão estão elencados aqui, caso queria se aprofundar no assunto recomendo visualizar as postagens do Daniel Roth dentro do portal da Microsoft.

Documentação e Posts sobre atualizações: Daniel Roth

  • Minimal Api/hosting: Está é a grande novidade que vai facilitar em muito a construção de pequenos Endpoints e melhorar a performance em geral do warm-up (tempo de "aquecimento") para as Apis, esse ponto foi levado em consideração pela Microsoft pelo fato do BOOM do Serverless + functions que necessitam de um desempenho de inicialização maior. A Startup.cs "Morreu" 😥 e agora o Program.cs "faz tudo", sendo possível desenvolver apenas com ele, sim, com cara de Node.Js. Segue exemplo dos novos endpoints:

Github com exemplo de uso: DamianEdwards/MinimalApiPlayground


using System.ComponentModel.DataAnnotations;
using Microsoft.Data.Sqlite;
using Dapper;

var builder = WebApplication.CreateBuilder(args);

var connectionString = builder.Configuration.GetConnectionString("TodoDb") ?? "Data Source=todos.db";
builder.Services.AddScoped(_ => new SqliteConnection(connectionString));
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

app.MapPut("/todos/{id}/mark-incomplete", async (int id, SqliteConnection db) =>
    await db.ExecuteAsync("UPDATE Todos SET IsComplete = false WHERE Id = @Id", new { id }) == 1
        ? Results.NoContent()
        : Results.NotFound())
    .WithName("MarkIncomplete")
    .Produces(StatusCodes.Status204NoContent)
    .Produces(StatusCodes.Status404NotFound);

app.MapDelete("/todos/{id}", async (int id, SqliteConnection db) =>
    await db.ExecuteAsync("DELETE FROM Todos WHERE Id = @id", new { id }) == 1
        ? Results.NoContent()
        : Results.NotFound())
    .WithName("DeleteTodo")
    .Produces(StatusCodes.Status204NoContent)
    .Produces(StatusCodes.Status404NotFound);
Enter fullscreen mode Exit fullscreen mode
  • MiniValidator / Metadata: Com a chegada do conceito de Minimal Api o .Net6 também traz uma validação mais enxuta e performática, a biblioteca MiniValidator é uma versão minimalista dos DataAnnotations que adiciona suporte para as chamadas de validação de linha única e recursão com detecção de ciclo. E para fechar a concepção de Minimal foi desenvolvida diversas Metadatas para facilitar a documentação e estruturação dos novos recursos, como demostrado no exemplo a seguir.
app.MapPost("/todos", async (Todo todo, SqliteConnection db) =>
    {
            //Realiza a validação da DTO
        if (!MiniValidator.TryValidate(todo, out var errors))
            return Results.ValidationProblem(errors); 

        var newTodo = await db.QuerySingleAsync<Todo>(
            "INSERT INTO Todos(Title, IsComplete) Values(@Title, @IsComplete) RETURNING * ", todo);

        return Results.Created($"/todos/{newTodo.Id}", newTodo);
    })
    .WithName("CreateTodo") //Define nome para o endpoint
    .ProducesValidationProblem()
    .Produces<Todo>(StatusCodes.Status201Created) // Documenta o retorno;
Enter fullscreen mode Exit fullscreen mode
  • Suporte a HTTP/3: A Microsoft já introduziu nativamente o suporte a nova versão do nosso conhecido e querido protocolo de transferência, que por sua vez promete manter os padrões atuais e atribuir mais desempenho por meio do uso QUIC, visando tirar o bloqueio das transações em paralelo quando um pacote era "perdido".

Mais informações: HTTP/3 Support in .NET 6

  • Hot Reload: Este é um recurso muito bacana para nós desenvolvedores pois permite atualizar o código em tempo real sem perder o estado da aplicação, auxiliando em muito as validações UI e funcionando também com o dotnet watch run no VSCode, já para o Visual Studio basta clicar sobre o ícone de "Fogo 🔥" na parte superior depois de realizar alguma mudança.

Mais informações: Introducing the .NET Hot Reload experience for editing code at runtime

  • Blazor / .NET MAUI / SPA: A nova sensação do front que virá com o .Net6 é o MAUI que tem o foco em criar Apps com visuais mais modernos e compartilhando mais código entre as plataformas, ao longo do tempo ele será compatível com macOS e Windows, mas no momento o suporte é para Android e iOS. Também é importante mencionar a chegada da biblioteca ´Xamarin.Essentials´ que possibilita acessar recursos nativos dos dispositivos, como sensores, armazenamentos e afins. Já para o SPA agora é possível separar o front-end do back-end em dois projetos e foi acrescentado o ecossistema de estruturas JavaScript SPA no Visual Studio, com teste de unidade, gerenciamento de GUI npm, modelos baseados em CLI e mais novidades a serem anunciadas.

Mais informações: ASP.NET Core updates in .NET 6 Release

  • Using Global: Sim, ISSO MESMO!!🥳 Agora é possível definir usings globalmente, basta acrescentar a palavra global antes de declarar o using, muito útil quando usado em conjunto com arquivos de configuração geral da aplicação, permitindo que todos os outros arquivos possuam acesso aos usings.
global using System;
global using System.Collections.Generic;
global using System.IO;
global using System.Linq;
Enter fullscreen mode Exit fullscreen mode

  • File-scoped namespace declaration: Agora é possível declarar os namespaces de sua aplicação sem abrir e fechar as chaves, basta colocar um ; (ponto e virgula) no final, como no exemplo abaixo.
namespace MyNamespace;
Enter fullscreen mode Exit fullscreen mode
  • Extended property patterns: O novo C#10 já está apto para trabalhar com referência a propriedades ou campos aninhados em uma propriedade, como pode ser visto abaixo.
{ Prop1: { Prop2: pattern } } // Antiga maneira
{ Prop1.Prop2: pattern } // Nova maneira
Enter fullscreen mode Exit fullscreen mode
  • LINQ / CHUCK / MetodosBy: Chegou também melhorias para os métodos OrDefault do Linq e afins, agora sendo possível definir no próprio método um valor default, um ponto muito interessante foi a vinda do IEnumerable Chunk para facilitar a paginação e manipulação de dados, em conjunto com diversos métodos *By para utilização de listas.
var list = Enumerable.Range(1, 100);
foreach(var chunk in list.Chunk(10))
  foreach(var item in chunk) 
    Console.WriteLine(item);

var foundValue = hayStack.FirstOrDefault(x => x == needle, -1);

Console.Write(people.MaxBy(x => x.Age));
Enter fullscreen mode Exit fullscreen mode

Mais informações: .NET 6 / C# 10 Top New Features Recap

> Legal, mas existe algo para chegar ainda?

A Microsoft sempre tem projetos "escondidos" que estão sendo trabalhados por baixo dos panos para criar grandes mudanças na sua plataforma, aqui citarei dois desses projetos que estão sendo desenvolvidos para as próximas versões do .Net, o Houdini e o Bedrock.

  • Projeto Houdini: A Microsoft quer modificar a sua Stack para deixa-la mais performática, e esse projeto vem com tudo para cima do MVC, com foco em ACABAR com ele, e tirar todo o peso que seus componentes geram para as Apis e afins.

Mais informações: The .NET Stacks, #28: The future of MVC and themes of .NET 6

  • Projeto BedRock: Visando novamente a alta performance da plataforma, esse projeto tem o intuito de abstrair toda a camada de comunicação cliente-server, de forma que o .Net vai verificar as opções disponíveis e escolher a melhor forma de realizar essa troca de dados dependendo do ambiente e da situação. Esse projeto possui três pilares (transporte, middleware e protocolo) e será usado pelo IConnectionFactory e IConnectionListener.

Mais informações: BedrockFramework

> Por enquanto é isso, obrigado! ✌️

Qualquer dúvida pode me chamar para um bate-papo, e agradeço a sua atenção até aqui, espero te ver em outras publicações.

lucastmp image

Discussion (2)

Collapse
anielcrz profile image
Aniel Cruz

Opa. Artigo legal e bastante explicativo sobre as novas tendencias da plataforma. Contudo creio que faltou a referência do projeto Houdini.

Collapse
lucastmp profile image
Lucas Paes Author

Ajustado, obrigado pela dica.

Aniel esse projeto ainda não foi divulgado oficialmente e não tem conteúdo relevante sobre, mas em breve veremos mais informações.

twitter.com/davidfowl/status/13166...