 .NET 6 - Minimal APIs  
usando o Dapper
  .NET 6 - Minimal APIs  
usando o Dapper
|  | Hoje veremos como criar uma Minimal APIs no .NET 6.0 usando os recursos do Dapper. | 
O novo recurso do .NET 6.0 - Minimal APIs - para a ASP .NET Core 6 permite, criar APIs com o mínimo de dependência do framework WebAPI e o mínimo de código e arquivos necessários para o desenvolvimento minimalista de APIs.
|   | 
Preparando o ambiente
Um dos objetivos do novo recurso Minimal APIs do NET 6 é facilitar o aprendizado para quem esta iniciando com a plataforma .NET.
Existe muita coisa a explorar com o advento das Minimal APIs e hoje irei apenas criar uma API mínima usando o Dapper.
Vou continuar usando o Visual Studio 2022 mas isso pode ser feito também usando a ferramenta NET CLI e o VS Code.
Assim nosso objetivo principal será :
A configuração do ambiente para o .NET 6 requer a instalação do .NET SDK 6.0.0-rc2 (já estamos na RC2) isso pode ser feito baixando o SDK para o ambiente Linux ou MacOs; para o Windows basta baixar o Visual Studio 2022 para já poder trabalhar com o NET 6.
Para este exemplo não vou usar o EF Core e assim vamos criar ou usar um banco de dados SQL Server já existente.
O script para criar a tabela Tarefas no banco de dados CadastroDB que iremos usar é dado a seguir:
| USE [CadastroDB]
GO
CREATE TABLE [dbo].Tarefas(
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[Atividade] [nvarchar](255),
	[Status] [nvarchar](100),
)
GO | 
Para este projeto iremos instalar os seguintes pacotes Nuget:
É claro que não queremos trilhar por este caminho e podemos resolver este problema refatorando o código e estruturando o projeto para obter um código mais robusto.
Criando o projeto no Visual Studio 2022
Como não há nenhum template ASP.NET Core específico para construir uma API mínima, vamos usar o template “ASP.NET Core Empty” para criar seu projeto no VS 2022:

Usando a ferramenta NET CLI podemos emitir o comando : dotnet new web -o MinApi
Criando o projeto no VS 2022, a seguir basta informar o nome do projeto que no nosso exemplo será : ApiTarefas
A seguir basta selecionar o Framework .NET 6.0 (que atualmente esta em RC2) e clicar em Create :

Teremos a solução será criada com a seguinte estrutura :

Observe que temos apenas o arquivo appsettings.json e o arquivo Program e a pasta Properties.
Abrindo o arquivo Program temos um código simplificado usando o recurso do Top Level Statements do C# 9.0.
Para mais detalhes sobre as Minimal APIs veja o meu artigo: ASP .NET Core 6 - Criando Minimal APIs - I
Agora vamos instalar os pacotes Nuget acionando o menu Tools -> ..-> Manage Nuget Package for Solution e selecionando o pacote na guia Browse; (É importante deixar a opção include prerelease marcada)
Ao final seu arquivo de projeto (.csproj) deverá estar definido assim:

Agora temos tudo pronto para iniciar a criação da nossa Minimal API.
Para tornar o projeto mais estruturado eu vou criar as pastas:

Assim na pasta Data vamos criar o record Tarefa:
| using System.ComponentModel.DataAnnotations.Schema; 
		[Table("Tarefas")] 
 | 
Criamos um tipo Record 'Tarefa' para usar como DTO e como Model.
Nesta pasta vamos criar a classe TarefaContext onde vamos definir o delegate GetConnection() :
| using System.Data; 
		public class 
		TarefaContext | 
Criamos um delegate GetConnection que será usado na injeção de dependência para criar a conexão com o SQL Server.
Na pasta Extensions vamos criar o método de extensão AddPersistence na classe estática ServiceCollectionsExtensions:
| using System.Data.SqlClient; using static TarefaContext; 
		public static class ServiceCollectionsExtensions                 return builder; | 
Registramos o delegate GetConnection como um serviço de maneira que podemos obtê-lo mais tarde via injeção de dependência.
E para concluir vamos criar na pasta Endpoints a classe estática TarefasEndpoints onde teremos o método MapTarefasEndpoints onde vamos definir o mapeamento para os endpoints da nossa API usando os métodos auxiliares da classe WebApplication:
| using Dapper.Contrib.Extensions; using static TarefaContext; 
		public static class 
		TarefasEndpoints         
		app.MapGet("/tarefas", async (GetConnection 
		connectionGetter) =>         
		app.MapGet("/tarefas/{id}", async (GetConnection 
		connectionGetter, int id) =>         
		app.MapDelete("/tarefas/{id}", async (GetConnection 
		connectionGetter, int id) =>         
		app.MapPost("/tarefas", async (GetConnection 
		connectionGetter, Tarefa Tarefa) =>         
		app.MapPut("/tarefas", async (GetConnection 
		connectionGetter, Tarefa Tarefa) =>     } | 
Com isso a nossa solução ficou com a seguinte estrutura :

Agora podemos definir o código na classe Program conforme abaixo:

Ao invés de colocar todo o código no arquivo Program estruturamos o projeto criando pastas e separando em arquivos o código conforme a responsabilidade.
Temos assim um código mais estruturado e enxuto na classe Program.
Antes de executar precisamos definir no arquivo launchSettings da pasta Properties do projeto a definição para abrir o Swagger na execução:
| ... 
		 "profiles": { | 
E também precisamos definir no arquivo appsettings.json a string de conexão com o SQL Server:
| { "ConnectionString": "Data Source=DESKTOP-BHP8771\\SQLEXPRESS;Initial Catalog=CadastroDB;Integrated Security=True", "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*" } | 
Executando o projeto iremos obter os endpoints na interface do Swagger:

Agora basta testar cada endpoint verificando o funcionamento da API.
Pegue o projeto exemplo aqui: 
 ApiTarefas.zip (sem as referências)
 ApiTarefas.zip (sem as referências)
"Portanto, irmãos, empenhem-se 
	ainda mais para consolidar o chamado e a eleição de vocês, pois se agirem 
	dessa forma, jamais tropeçarão, e assim vocês estarão ricamente providos 
	quando entrarem no Reino eterno de nosso Senhor e Salvador Jesus Cristo."
	2 Pedro 1:10,11
Referências:
C# - Lendo e escrevendo em arquivos textos e binários
C# - Entendo o I/O na plataforma .NET
C# - Fluxo assíncrono ou async streams
C#- Apresentando Streams assíncronos