Minimal API es una nueva plantilla que utiliza todas las características de C# 10 y .NET 6 para crear servicios API con mucha menos complejidad, capas, clases que veníamos utilizando con la tradicional plantilla MVC con controladores. Está inspirada en otras tecnologías como node.js.
Ventajas de Minimal APIs
- Complejidad reducida Reducido código boilerplate
- Fácil para empezar: sólo se necesita el Program.cs y su csproj y 3 líneas de código para crear la API
- Está basada en .Net 6 y C# 10, por lo que todas las últimas mejoras y funcionalidades son compatibles desde el principio
- API sin controladores
- Rendimiento: dado que la aplicación es tan sencilla, se ha simplificado el proceso de arranque necesario para crear y compilar la aplicación, lo que significa que la aplicación se ejecuta mucho más rápido.
Ejemplo Minimal API
El código de ejemplo de esta primera parte se puede obtener desde aquí
Si queremos empezar a ver sus características necesitaremos tener instalado Visual Studio 2022 y crear un nuevo proyecto de tipo ASP.NET Core Web API
Es necesario desmarcar la siguiente opción para tenerlo configurado en modo Minimal API
Una vez creado el proyecto debe de aparecernos una estructura de proyecto como la siguiente
Si te fijas bien, podrás darte cuenta de que con respecto a una API de las que teníamos costumbre en versiones anteriores a .NET 6, no tenemos ciertos elementos. Ha desaparecido la carpeta Controllers y no tenemos el típico archivo de ejemplo WeatherForecast.cs ni el fichero Startup.cs que venía como ejemplo al crear dicho proyecto. Esto no se ha perdido, está implementado de una forma diferente. Pero hay más cambios, vamos a verlos en detalle.
Como hemos mencionado, el fichero Startup.cs ha desaparecido, el cual tenía un aspecto como el siguiente en versiones anteriores a .NET 6:
Y hemos visto que el fichero Program.cs ha desaparecido, en las versiones anteriores a .NET 6 lo teníamos como el siguiente:
Ahora en .NET 6 tenemos todo este código de estos dos ficheros concentrado en el fichero Program.cs:
El código de los Controllers que teníamos en versiones anteriores a .NET 6 era el siguiente:
El cual ahora lo tenemos en la siguiente sección del propio Program.cs de .NET 6:
Con esto se ha conseguido hacer que haga falta mucho menos código a la hora de empezar una API en .NET 6
Añadiendo inyección de dependencia
Vamos a añadir un pequeño complemento a nuestra API. Digamos que queremos descargar algo de lógica a un servicio, sólo para mantener nuestra API limpia. Aunque esta es una Minimal API, podemos crear otros archivos si queremos, y llevarnos el código fuera. Para ello vamos a añadir el nuget DependencyInjection
Una vez instalado vamos a crearnos un servicio para WeatherForecast como el siguiente:
Y cambiamos nuestro Program.cs para hacer uso de la inyección de dependencias y dejar la llamada al servicio tal que así:
Con lo que ya estaríamos en disposición de ejecutar nuestra API y ver el resultado tal y como el siguiente:
Añadiendo Endpoints
Hasta ahora hemos visto la plantilla de ejemplo con el endpoint por defecto al que le hemos añadido inyección de dependencias, vamos a añadir algunos endpoints para que veamos cómo proceder.
Vamos a añadir un método que nos obtenga un valor por su id, en este caso como estamos trabajando con una lista de strings lo vamos a hacer tal que así:
Vamos a crear un endpoint para obtener todos los elementos de la lista de WeatherForecasts:
Lo siguiente sería crear un elemento nuevo para la lista que teníamos, tal que así:
Si quisiéramos actualizar un item de la lista, podríamos hacerlo de la siguiente manera:
Para eliminar un item de la lista lo podríamos hacer de la siguiente forma:
Para tener estas funcionalidades contempladas en nuestro weatherService, hemos hecho la siguiente implementación:
Una vez realizados todos estos pasos podemos ejecutar la Api y ejecutar distintas operaciones sobre ella que irá guardando en memoria.
Utilizando una BD con EF
Como puedes ver, estamos trabajando con datos en memoria, si quisieramos pasar estos datos a una DB, como por ejemplo una SQLite deberíamos de añadir un par de nugets:
Añadimos a nuestro appSettings la cadena de conexión:
Nos creamos una clase como la siguiente para tener nuestro DBContext:
Y en nuestro Program.cs añadimos lo siguiente para poder conectarnos a la DB:
Ahora necesitamos realizar una migración para crear nuestra DB:
Si te da error de que no reconoce el comando dotnet ef migrations, como me pasó la primera vez que lo ejecuté, es debido a que en esta nueva versión aún no lo tienes instalado a nivel global, lo cual puedes solventar ejecutando esto:
Y ahora cambiamos nuestra implementación del Servicio a la siguiente para hacer uso del DBContext:
Y nuestro Program.cs al siguiente código, donde ahora añadimos como Scoped nuestro WeatherService:
Con todos estos cambios podemos lanzar la Api y ver Swagger para poder realizar operaciones sobre ella pero ahora guardando en una DB Sqlite.
Recursos adicionales:
Si quieres conocer más posibilidades que permite este nuevo tipo de plantilla, os invitamos a que le deis un vistazo a los siguientes recursos que reviséis estos enlaces de ayuda.