domingo, 23 de noviembre de 2025

Programando en C# no. 12 (ASP .NET Core)

En está ocasión crearemos un proyecto webapi con ASP .NET Core mediante la herramienta ``dotnet``. Si no la tienes instalada puedes ir a este sitio:

https://dotnet.microsoft.com/es-es/download

¿Qué haremos? Un servicio API para obtener el nuevo sueldo de un empleado de acuerdo a estos datos de entrada: id, nombre, sueldo base, edad, género y estado civil. Por el momento no usaremos alguna base de datos. Las condiciones a cumplir para el nuevo sueldo son las siguientes:

IF estado_civil == "casado" THEN
   bono25Porciento();
ELSE
   bono10Porciento();
END IF;

IF sueldo_base <= 20000 THEN
   aumentoSueldo25Porciento();
ELSE
   IF sueldo_base > 25000 THEN
      aumentoSueldo5Porciento();
   END IF;
END IF;

El servicio tomará los datos del usuario (id, nombre, sueldo base, edad y género) y con base a las condiciones dará un aumento. Como se puede ver no tiene mucha ciencia entender lo que queremos realizar.

Abrimos una terminal y creamos el proyecto:

$ dotnet new web -o SueldoNuevo
$ cd SueldoNuevo
$ code -r ../SueldoNuevo

Esto nos creará el proyecto, nos ubicará en el directorio y abrirá Visual Studio Code. Abrimos el programa principal y lo editamos:

Program.cs

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => "Sueldo nuevo en C#");

app.Run();

Ejecutamos con este comando:

$ dotnet run

Abrimos el navegador en la ruta: http://localhost:5048

Salida:

Sueldo nuevo en C#

Como queremos hacer una aplicación modular, crearemos una carpeta Model y ahí tendremos una clase llamada Empleado.cs.

using System;

namespace Model
{
    public class Empleado
    {
        public int Id
        {
            get;set;
        }

        public string Nombre
        {
            get; set;
        }

        public int Edad
        {
            get; set;
        } 

        public double SueldoBase
        {
            get; set;
        }

        public bool isCasado
        {
            get;set;
        }

        public string Genero
        {
            get; set;
        }

        public Empleado()
        {
            Id = 0;
            Nombre = string.Empty;
            SueldoBase = 0.0;
            Edad = 0;
            isCasado = false;
            Genero = string.Empty;
        }
    }
}

Ahora creamos un directorio denominado como Services. Dentro crearemos una interface llamada IEmpleadoService.cs y una clase que la implementa llmada EmpleadoService.cs.

IEmpleadoService.cs

using System;
using Model;

namespace Services
{
    public interface IEmpleadoService
    {
        double GetNuevoSueldo(Empleado empleado);
    }
}

EmpleadoService.cs

using System;
using Model;

namespace Services
{
    public class EmpleadoService: IEmpleadoService
    {
        public double GetNuevoSueldo(Empleado empleado)
        {
            var sueldoFinal = empleado.SueldoBase;
            if (empleado.isCasado)
            {
                sueldoFinal += empleado.SueldoBase + 0.25;
            }else
            {
                sueldoFinal += empleado.SueldoBase + 0.10;
            }

            if (empleado.SueldoBase <= 20000)
            {
                sueldoFinal += empleado.SueldoBase + 0.25;
            }else if (empleado.SueldoBase > 25000)
            {
                sueldoFinal += empleado.SueldoBase + 0.05;
            }else
            {
                sueldoFinal += empleado.SueldoBase + 0.01;
            }
            
            return sueldoFinal;
        }
    }
}

Ahora implementaremos la lógica descrita en el pseudo código de arriba. Modificamos el programa principal:

Program.cs

using Model;
using Services;

var builder = WebApplication.CreateBuilder(args);

// Registro del servicio en el contenedor de DI
builder.Services.AddScoped<IEmpleadoService, EmpleadoService>();

var app = builder.Build();

app.MapGet("/", () => "Sueldo nuevo en C#");

// Endpoint que usa el servicio inyectado
app.MapPost("/calcular", (Empleado empleado, IEmpleadoService empleadoService) =>
{
    double nuevoSueldo = empleadoService.GetNuevoSueldo(empleado);
    return new
    {
        empleado.Nombre,
        SueldoBase = empleado.SueldoBase,
        SueldoFinal = nuevoSueldo
    };
});

app.Run();

¿Qué podemos notar en este programa?

  • Hemos inyectado la clase servicio (EmpleadoService) de manera similar a lo que se hace con @Autowired de Spring Boot. 
  • Hemos creado un endpoint con la lógica del servicio inyectado.

Para hacer una petición al servicio crearemos un script con Powershell:

nuevosueldo.ps1

$body = @{
    Id = 1
    Nombre = "Pedro Ramírez"
    Edad = 35
    SueldoBase = 18000
    isCasado = $true
    Genero = "M"
} | ConvertTo-Json

Invoke-RestMethod -Uri "http://localhost:5048/calcular" `
    -Method Post `
    -ContentType "application/json" `
    -Body $body

Si tenemos curl, podemos hacerlo de esta forma:

curl -X POST http://localhost:5048/calcular \
  -H "Content-Type: application/json" \
  -d '{
    "Id": 1,
    "Nombre": "Pedro Ramírez",
    "Edad": 35,
    "SueldoBase": 18000,
    "isCasado": true,
    "Genero": "M"
  }'

Ejecutamos con este comando:

$ dotnet run

Ejecutamos el script:

$ .\nuevosueldo.ps1 

Si todo va bien, la salida será la siguiente:

nombre        sueldoBase sueldoFinal
------        ---------- -----------
Pedro Ramírez      18000     54000.5

UPDATE: También podemos hacer peticiones con una archivo *.http. Crearemos uno en el directorio principal y lo nombraremos MyRequests.http. Tendrá el siguiente contenido:

POST http://localhost:5048/calcular
Content-Type: application/json

{
  "Id": 1,
  "Nombre": "Pedro Ramírez",
  "Edad": 35,
  "SueldoBase": 18000,
  "isCasado": true,
  "Genero": "M"
}


GET http://localhost:5048/

Si todo va bien, veremos este resultado:

¡Hemos creado un sencillo servicio api con C#!

Conclusión:

Creamos una aplicación webapi con C# desde la herramienta dotnet.

Aprendimos como se puede dividir la aplicación modularmente (directorios Model y Services).

Como implementar métodos de una interface C# (IEmpleadoService.cs y EmpleadoService.cs)

Como usar inyección de dependencia similar a lo que se hace con Spring Boot.

Como hacer una petición al servicio usando un script de Powershell y/o curl. Además del archivo *.http

Lo que sigue es usar una Base de datos (MS SQL Server, Maria DB, PostrgeSQL, etc.) y tablas para replicar esa funcionalidad, pero lo haremos en otra ocasión.

Enlaces:

https://learn.microsoft.com/es-es/aspnet/core/tutorials/min-web-api?view=aspnetcore-10.0&tabs=visual-studio-code

https://dotnet.microsoft.com/es-es/apps/aspnet/apis

No hay comentarios:

Publicar un comentario

WebSocket en un vistazo

WebSocket es un protocolo que permite la comunicación bidireccional y persistente en tiempo real entre un cliente (como un navegador web) y ...

Etiquetas

Archivo del blog