.NET Core
¡Hola chicos! ¿Cómo han estado? En las últimas semanas, he estado en proceso de entrevistas para puestos de desarrollador de C#.
Trabajo con ASP.NET Core todos los días, lo que significa que cuando estoy en casa no elijo C# como lenguaje de practicas. Por esto mismo, el código C# que tengo en mi Github es bastante antiguo y pertenece a los primeros años de mi carrera.
Así que decidí usar los desafíos de programación que me brindan los empleadores para crear un código C# más nuevo para mi GitHub y, al mismo tiempo, crear una buena guía para que puedan seguir mejorando su desarrollo personal.
Qué esperar de este tutorial
Al final de la serie, tendremos un microservicio con las siguientes características:
- Integrado con MongoDB.
- Arquitectura en capas con una clara separación de responsabilidades.
- Documentación de la API.
- Soporte de Docker.
- Tests Unitarios.
Introducción
Tenemos una pequeña empresa, vendemos computadoras.Cada vez que se vende una computadora nueva debemos registrar el pedido con la cuantía y el cliente que lo compró.
Vamos a crear un pequeño microservicio que se conecta a una instancia de MongoDB y nos permite crear/leer/actualizar/eliminar pedidos, además de obtener algunos cálculos adicionales sobre el gasto de los usuarios.
Nuestro modelo de Order o Pedido será el siguiente:
{
"id": "guid",
"userId": "guid",
"cantidad": "int"
}
Definición básica
Comenzamos creando una aplicación web ASP.NET Core 3.1 con la plantilla de API y la compatibilidad con Docker habilitada en Visual Studio 2019.

En nuestro caso, introducimos WeatherForecast, lo que nos creará un modelo y un controlador (Controller) con una API lista para ser usada.

Después de eliminar el código predeterminado, comenzamos creando nuestro modelo y un controlador básico llamadoOrdersController. Los primeros métodos que desarrollamos son POST y GET,lo que nos permite probar la creación y obtención de pedidos:
Route("v1/[controller]")]
[ApiController]
public class OrdersController : ControllerBase
{
/// <summary>
/// Retrieves all orders
/// </summary>
/// <returns>a list with all the orders available</returns>
[HttpGet]
public async Task<IEnumerable<Order>> GetAll()
{
throw new NotImplementedException();
}
/// <summary>
/// Retrieves the order that matches the id supplied
/// </summary>
/// <returns>one order model</returns>
[HttpGet("{orderId}")]
public async Task<ActionResult<Order>> Get(Guid orderId)
{
throw new NotImplementedException();
}
/// <summary>
/// Creates a new order
/// </summary>
/// <returns>the newly created order</returns>
[HttpPost]
public async Task<ActionResult<Order>> Post([FromBody]OrderCreateUpdate orderRequest)
{
throw new NotImplementedException();
}
}
En el código anterior hemos realizado las siguientes tareas:
- Agregado los endpoints GetAll, Get y Post.
- Incluimos comentarios para la API pública.
- Versionado nuestra API usando la nomenclatura v1/[controller] en los endpoints.
Si están prestando atención, habrán notado que el Post tiene un modelo que aún no hemos definido: OrderCreateUpdate.
Cuando creas elementos en una base de datos, no se debe proporcionar un OrderId, ya que el pedido aún no existe, entonces es una buena práctica separar el modelo de API en dos para que estos puedan cambiar de forma independiente.
Este es el modelo para OrderCreateUpdate:
{
"userId": "guid",
"cantidad": "int"
}
public Guid UserId { get; set; }
public int Amount { get; set; }
Conexión a la base de datos
Por ahora, en lugar de crear una base de datos local o jugar con Docker desde el comienzo, usaremos una base de datos en línea como las proporcionadas por MongoDBAtlas.
De vuelta en el proyecto, necesitamos encontrar una manera de configurar los ajustes para conectarnos a nuestra base de datos, lo hacemos usando el patrón de opciones que trae ASP.NET Core. Definimos la siguiente configuración:
public class OrdersServiceOptions
{
public string DatabaseConnectionString { get; set; }
public string DatabaseName { get; set; }
public string CollectionName { get; set; }
}
Eso es todo por hoy. Continuamos en otro contenido.