Con la llegada de .NET 6, C# nos permite crear lo que se llaman “minimal APIs” que básicamente es la adaptación de lo que ya tenemos disponible en .NET 5 con Top level programs a las API.
En este vídeo vamos a ver como crear y utilizar minimal APIs así como mi opinión personal.
Índice
1 - Mi opinión personal sobre minimal APIs
Primero de todo quiero empezar con mi opinión personal. Esto es debido a que llevo un tiempo pensando sobre esta nueva funcionalidad del lenguaje y finalmente tengo una opinión ya formada.
Desde la llegada de .NET 5 y sus programas de alto nivel yo ya veía que algo así estaba por venir, y no tengo claro que sea algo beneficioso a largo plazo para los desarrolladores. Y me explico, tanto los programas de alto nivel como las minimal API’s son funcionalidades muy buenas para atraer a nuevos desarrolladores al lenguaje, pero con ellas es muy difícil hacer aplicaciones extensas.
Por ejemplo, un caso de uso que sí que le veo es para hacer pequeñas aplicaciones, como scripts que harías en otros lenguajes como python o por ejemplo funciones serverless. Personalmente tengo experiencia con NodeJS y la experiencia que tengo es porque era muy fácil crear funciones serverless en AWS cuando estas eran pequeñas, donde en C# tenía un proyecto, tener que compilar, etc, en NodeJS era un simple fichero de 30 líneas.
Pero esta es mi opinión, basada en mi experiencia personal, Microsoft tiene un equipo para decir las funcionalidades, que seguramente haya pensado en muchos otros casos de uso. Aunque sigo pensando que lo principal es atraer nuevos usuarios, lo cual es bueno.
Me gustaría saber tu opinión si quieres compartirla puedes responder a este tweet.
2 - Crear una minimal API en C#
Por ahora (Agosto 2021) .NET 6
sigue en versión preview y no está disponible como plantilla en ninguna versión de visual studio u otro IDE, la única forma de crear una minimal api es a través de la línea de comandos con el siguente comando:
dotnet new web -o MinimalApi
- Nota: alternativamente puedes crear todos los ficheros a mano, necesitarás el
program.cs
,.csproj
yappsettings.json
. - Nota2: La otra opción es crear una aplicación de consola, cambiar el
targetFramework
por.net6.0
y eliminar todo el contenido deprogram.cs
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<LangVersion>preview</LangVersion>
</PropertyGroup>
</Project>
Y si hemos creado nuestra minimal aplicación utilizando el comando anterior nuestro program.cs
contendrá el siguiente código:
using System;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Hosting;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.MapGet("/", () => "Hola NetMentor!");
app.Run();
En el código que nos viene, tenemos todo lo que necesitamos para ejecutarlo desde la línea de comandos con el comando dotnet run
y este sería el resultado:
Que el código funcione es posible debido a que Microsoft.AspNetCore.Builder
provee una clase llamada WebApplication
que contiene un método CreateBuilder
el cual una vez lo construimos utilizando .build()
nos genera la pipeline de HTTP
la cual permite recibir llamadas HTTP/HTTPS.
Y junto a la pipeline, disponemos de los extension methods Map
, MapGet
, MapPost
, MapPut
, los cuales reciben un patrón que actúa como la url que esperamos y un delegado para ejecutar la acción indicada.
En nuestro caso sería la siguiente:
app.MapGet("/", () => "Hola Netmentor!");
app.MapGet("/{id}", (string id) => $"Simulación del id: {id}");
Un endpoint es simplemente nuestra url y el otro es url/id
el cual imprime un mensaje.
3 - Otras funcionalidades posibles con Minimal APIs
Las minimal apis son aplicaciones completas, por lo que podemos hacer lo que queramos en ellas, podemos crear clases y procesos como haríamos en cualquier otro tipo de aplicación.
Por ello podemos implementar aplicaciones de terceros como por ejemplo AutoMapper
, Dapper para nuestras conexiones sql, o incluso ineyeccion de dependencias si incluimos el paquete Microsoft.Extensions.DependencyInjection.Abstractions
, pero como he explicado antes creo que incluir muchas clases en nuestras minimal APIs es contraproducente, para aplicaciones grandes veo una solución mas aceptable utilizar nuestras APIs normales.
3.1 Añadir swagger to a minimal API
Para añadir soporte para swagger
lo único que debemos hacer es incluir la referencia al paquete Swashbuckle.AspNetCore
y un par de líneas a nuestro código:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddEndpointsApiExplorer(); //<- esta líena
builder.Services.AddSwaggerGen(); //<- esta líena
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseSwagger(); //<- esta línea
app.MapGet("/", () => "Hola NetMentor!");
app.UseSwaggerUI(); //<- esta línea
app.Run();
Ahora únicamente debemos ir al endpoint https://localhost:5001/swagger
para poder ver la interfaz de swagger.
Conclusión
- En este post he dado mi opinión sobre minimal APIs y sobre top level programs.
- Como crear minimal APIs en C#