PARTE I: DOMINA EL DISEÑO DE UNA API
PARTE II: ARQUITECTURAS Y CONTROLADORES API
LABORATORIOS ¡Aplica ya! : DISEÑO Y VARIANTES API CON INMEMORY Y SQL SERVER

Elementos de una API REST InMemory

   Después de este vídeo

Aprenderás a:

  • Comprender el concepto de una base de datos InMemory.
  • Diseñar una API REST con el modelo InMemory.
  • Realizar los ajustes de configuración en los archivos de .Net Core.

Cursos Institucionales.
El Aprendizaje Hecho Fácil. ¡Disfrútalo!

Cómo funciona una base de datos InMemory (IMDB)


Paquete: Microsoft.EntityFrameworkCore.InMemory.

Este proveedor de base de datos permite usar OMR Entity Framework Core basado en el motor de bases de datos relacionales, que podremos implementar incluso utilizando SqLite. La técnica de crear una base de datos en memoria es muy utilizada para diseñar laboratorios de pruebas, aunque es posible que el proveedor SQLite del modo en memoria sea un reemplazo de pruebas más adecuado para bases de datos relacionales. Por supuesto este tipo de base de datos se crea con la ejecución de la aplicación y desaparece al detenerla.

RAPIDEZ Y PRUEBAS
Los datos y el esquema de una IMDB se almacenan en la memoria principal RAM a cambio de ser registrada en disco duro facilitando velocidad de respuesta al despliegue de queries y CRUD. Por supuesto la industria  de telecomunicaciones, bancaria, de viajes y juegos multimediales se benefician de este paradigma realizando una réplica InMemory de modelos previamente diseñados en disco o sistemas de DBSR (Bases de datos relacionales) en el servidor.

Por supuesto con la revolución del almacenamiento de memoria tipo NVRAM es posible mantener los datos incluso por pérdida de energía o caídas del sistema, por encima de memorias tipo Flash.

Es importante aclarar que los datos son comprimidos y almacenados en memoria facilitando la navegación de modo directo sea por filas o columnas y de solo lectura. Así, InMemory Database es ideal para la analítica de datos y los casos de prueba.

En resumen y como parte de los beneficios de las IMDB tenemos :

  • Multiusuarios simultáneos.
  • No hay traducción.
  • Transaccionalidad rápida.
  • Juegos online más eficientes.
  • Sistemas de procesamiento bancario en tiempo real.
  • Procesamiento geoespacial inmediato.
  • Transmisión efectiva de datos por sensores.
  • Menos instrucciones de CPU.
  • Acceso a datos mediante punteros a diferencia de la lectura de bloques dispersos en un disco duro.

 Buenas prácticas


A través de cada laboratorio encontrarás código con estándares y convenciones como:

  • Variables tipo Objeto: Utiliza la abreviatura Obj antepuesta al nombre.
  • Nombre de campos o atributos: Haz uso de las convenciones internacionales. En este caso  hacemos uso del estilo Pascal Case.
  • Identación: Conserva la identación de apertura y cierre de llaves { …}, que .Net realiza de manera automatizada.
  • Nombre de clases: Haz uso de nombres nemotécnicos. Inicia el nombre con la abreviatura Cls.
  • Nombre de métodos: Utiliza nombres asociados a la funcionalidad o tarea que realizan. Un buen estándar es utilizar las primeras 4 letras del nombre especialmente cuando es extenso o compuesto: ListarEstudiantes – > ListEstu

Algorítmo para una bases de datos InMemory


Existen diversidad de técnicas que implementan una base de datos relacional en memoria. El siguiente algoritmo es una de esas alternativas. En Easy To Make hemos intentado optimizar todos los algoritmos de cada laboratorio.

  1. Crear proyecto de la plantilla  .Net Core API que incluye Swagger para realizar pruebas como clientes.
  2. Diseñar el Modelo de datos

--Modelo inicial. 
Terminaremos los laboratorios con un modelo de 1:M relacional.

public class ClsInstructor
    {
        
        public int id { get; set; }
        public string? NombreInstructor { get; set; }

        [DataType(DataType.Date)]
        public DateTime FechaRegInstructor { get; set; }
        public string? GeneroInstructor { get; set; }

        [Column(TypeName = "decimal(18,2)")]
        public double? PrecioHoraInstructor { get; set; }
    } 

3. Agregar las librerías necesarias.

APIS - InMemory - EASY TO MAKE

4. Crear el middleware DbContext que gestiona los datos.
Variante: Utilizaremos también Scaffold para generar de modo automático nuestro DbContext.


--Realizaremos ajustes en el Constructor
para hacer funcional la API.

public class EscuelaSurContext : DbContext
    {
        public DbSet<EscuelaSur.Models.ClsInstructor> ClsInstructors
        { get; set; } = null!;
       
        public EscuelaSurContext(DbContextOptions<EscuelaSurContext> options)
            : base(options)
        {  }//Contructor
    }//DbContext 

5. Crear la clase Seed o datos iniciales de carga.


-- SEED o semilla de datos utilizada en patrones MVC CodeFirst.
-- Podrás incluir más datos.
-- Esta Seed se modificará para nuestro siguiente laboratorio 
adicionando más entidades (1:M).
-- Puedes crear la Seed como una clase independiente 
o como parte de nuestro DbContext.

public void DatosIni()
        {
            ClsInstructor ObjInstructor = new ClsInstructor()
            {
                id = 1,
                NombreInstructor = "Cesar",
                FechaRegInstructor = new DateTime(2025, 10, 25),
                GeneroInstructor = "M",
                PrecioHoraInstructor = (double?)123.0M
            };
            ClsInstructors.Add(ObjInstructor);

            ObjInstructor = new ClsInstructor()
            {
                id = 2,
                NombreInstructor = "Veronica",
                FechaRegInstructor = new DateTime(2025, 01, 12),
                GeneroInstructor = "F",
                PrecioHoraInstructor = (double?)345.0M
            };
            ClsInstructors.Add(ObjInstructor);

            ObjInstructor = new ClsInstructor()
            {
                id = 3,
                NombreInstructor = "Astric Carolina",
                FechaRegInstructor = new DateTime(2025, 12, 10),
                GeneroInstructor = "F",
                PrecioHoraInstructor = (double?)678.0M
            };
            ClsInstructors.Add(ObjInstructor);
        }//DatosIni 

6. Agregar el Servicio al archivo Program.cs.


-- Agregaremos las referencias a nuestra capa de datos 
en el archivo > Program.cs.
-- Recuerda que este archivo es el archivo de inicio de 
una aplicación .NET Core.

// Add services to the container.
builder.Services.AddControllers();

builder.Services.AddDbContext<EscuelaSurContext>(options => 
options.UseInMemoryDatabase("EscuelaSur"));
builder.Services.AddScoped<EscuelaSurContext>();

--Además dejaremos por default nuestro cliente Swagger.
-- Podrás cambiarlo o referenciar el cliente de tu preferencia.

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
} 

   ¿Y el archivo Startup.cs?

Desde .Net 6.0 Seguramente habrás notado que el archivo Startup.cs no aparece en tu proyecto. No te preocupes, esto es un avance en el diseño de .NET Core. Este archivo ya no aparece en algunas de las plantillas predefinidas debido a que a partir de la versión .NET 6.0 se ha fusionado con el archivo Program.cs tomando sus funciones. Ahora se ha reducido de modo considerable el código using.

En conclusión, ¡Program.cs es el único punto de entrada de la aplicación!

7. Adicionar un controlador tipo API REST.
Observación: Si hemos utilizado Scaffold tendremos de modo automático nuestra API REST con su CRUD HTTP desde el paso 4.


-- Recuerda que .Net nos facilita una plantilla
para todos los proyectos Core, de tipo API.
-- Haremos uso de Scaffold para generar
un Controlador API listo para usar y asociado
a nuestro modelo de datos.

[Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        // GET: api/<ValuesController>
        [HttpGet]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET api/<ValuesController>/5
        [HttpGet("{id}")]
        public string Get(int id)
        {
            return "value";
        }

        // POST api/<ValuesController>
        [HttpPost]
        public void Post([FromBody] string value)
        {
        }

        // PUT api/<ValuesController>/5
        [HttpPut("{id}")]
        public void Put(int id, [FromBody] string value)
        {
        }

        // DELETE api/<ValuesController>/5
        [HttpDelete("{id}")]
        public void Delete(int id)
        {
        }
    } 

8. Finalmente revisaremos el correcto funcionamiento de nuestros endpoint API REST con el cliente Swagger.

   Laboratorios ¡Aplica ya!


Ahora manos a la obra!. Vamos a crear nuestra API con datos InMemory totalmente funcional en la siguiente colección de vídeos…