Microservicio de Clientes
Este tutorial te guiará, paso a paso, en la construcción de un microservicio REST utilizando los diferentes componentes que provee CodeDesignPlus. En este ejemplo, crearemos un microservicio de Cliente que responderá a peticiones REST, y servirá como la base para los siguientes artículos de la serie.
Responsabilidades del Microservicio
Section titled “Responsabilidades del Microservicio”El microservicio de Clientes tendrá las siguientes responsabilidades principales:
- Registrar nuevos clientes: Permitir a los usuarios crear una cuenta en nuestra plataforma.
- Actualizar información de clientes: Permitir a los usuarios modificar sus datos personales y de contacto.
- Consultar información de clientes: Permitir a otros microservicios acceder a la información de los clientes, de forma segura.
¿Qué Aprenderás?
Section titled “¿Qué Aprenderás?”- Cómo generar un microservicio de Clientes utilizando el generador
codedesignplus:microservice - Cómo modificar el microservicio de Clientes para adaptarlo a tus necesidades específicas.
- Conceptos de DDD (Domain-Driven Design), CQRS (Command Query Responsibility Segregation) y Ports and Adapters.
- Diagramas UML para representar los componentes del microservicio.
- Codificación de agregados, entidades, value objects, eventos de dominio, comandos, queries y controladores.
Diagramas UML
Section titled “Diagramas UML”Para visualizar mejor la estructura del microservicio de Clientes, vamos a crear algunos diagramas UML que representen los principales componentes del microservicio.
Agregados, Entidades y Value Objects
Section titled “Agregados, Entidades y Value Objects”Los agregados, entidades y value objects son los componentes principales de la capa de dominio de nuestro microservicio. En el caso del microservicio de Clientes, el agregado principal es el Client, que contiene la información del cliente, como su nombre, apellido, email y dirección. También tenemos value objects como Address, que representa la dirección del cliente.
Eventos de Dominio
Section titled “Eventos de Dominio”Los eventos de dominio son una parte fundamental de la arquitectura basada en eventos. En el caso del microservicio de Clientes, podemos definir eventos como ClientCreatedDomainEvent, ClientUpdatedDomainEvent y ClientDeletedDomainEvent, que se lanzarán cuando se registre, actualice o elimine un cliente, respectivamente.
Comandos
Section titled “Comandos”Los comandos son las acciones que pueden realizar los usuarios en nuestro microservicio. En el caso del microservicio de Clientes, podemos definir comandos como CreateClientCommand, UpdateClientCommand y DeleteClientCommand, que permiten a los usuarios registrar, actualizar y eliminar clientes, respectivamente.
Queries
Section titled “Queries”Las queries son las consultas que pueden realizar otros microservicios para obtener información del microservicio de Clientes. En el caso del microservicio de Clientes, podemos definir queries como GetClientByIdQuery y GetAllClientQuery, que permiten a otros microservicios obtener información de un cliente específico o de todos los clientes, respectivamente.
Creando el Microservicio
Section titled “Creando el Microservicio”El microservicio de Clientes es un buen ejemplo de microservicio CRUD. Por lo tanto, usaremos el generador codedesignplus:microservice con la opción --is-crud.
Para crear el microservicio de Clientes, usaremos el siguiente comando:
yo codedesignplus:microservice microservice \ --organization "Acme" \ --microservice "Clients" \ --description "Microservicio para gestionar los clientes de la tienda online." \ --contact-name "Jane Doe" \ --contact-email "jane.doe@example.com" \ --vault store-acme \ --is-crud \ --aggregate "Client"yo codedesignplus:microservice microservice ` --organization "Acme" ` --microservice "Clients" ` --description "Microservicio para gestionar los clientes de la tienda online." ` --contact-name "Jane Doe" ` --contact-email "jane.doe@example.com" ` --vault store-acme ` --is-crud ` --aggregate "Client"Para ejecutar el comando, abre tu terminal y copia y pega el comando anterior. Asegúrate de que estás en el directorio raíz donde deseas crear el microservicio de Clientes. El generador creará una nueva carpeta con el nombre del microservicio y generará la estructura base del microservicio dentro de esa carpeta.

Una vez que el comando termine de ejecutarse, el generador habrá creado la estructura base de nuestro microservicio de Clientes. Esto incluye la estructura de carpetas, los archivos de configuración iniciales, los modelos y las interfaces.

Modificando el Microservicio
Section titled “Modificando el Microservicio”Ahora que hemos generado el microservicio de Clientes, podemos comenzar a modificarlo para adaptarlo a nuestras necesidades específicas.
Value Objects
Section titled “Value Objects”Los value objects son objetos inmutables que representan un concepto o entidad específica en nuestro dominio. En la carpeta src/domain/ValueObjects modificaremos la clase Address para definir las propiedades de la dirección del cliente, como Country, State, City y AddressValue.
Para crear nuestro value object Address, seguiremos los siguientes pasos:
-
Ejecutamos el siguiente comando para crear el value object
AddressTerminal window yo codedesignplus:microservice valueObject --valueObjects "Address"
-
Modificamos la clase
Addresspara definir las propiedades de la dirección del cliente, comoCountry,State,CityyAddressValue.
-
Hacemos uso de los Guard Clauses para validar las propiedades de la dirección del cliente.

-
Creamos los códigos de error para cada propiedad de la dirección del cliente en la clase
Errors.
Eventos de Dominio
Section titled “Eventos de Dominio”Los eventos de dominio son una parte fundamental de la arquitectura basada en eventos. En el microservicio de Clientes, definiremos los eventos ClientCreatedDomainEvent, ClientUpdatedDomainEvent y ClientDeletedDomainEvent que se lanzarán cuando se registre, actualice o elimine un cliente, respectivamente.
En este punto, los eventos de dominio ya han sido creados por el generador CodeDesignPlus.Net.Generator. Sin embargo, necesitamos modificar las clases ClientCreatedDomainEvent, ClientUpdatedDomainEvent y ClientDeletedDomainEvent para definir las propiedades de los eventos.
El evento ClientCreatedDomainEvent se lanza cuando se crea un nuevo cliente en el sistema. Este es creado internamente en el agregado Client cuando se invoca el método Create.

El evento ClientUpdatedDomainEvent se lanza cuando se actualiza la información de un cliente en el sistema. Este es creado internamente en el agregado Client cuando se invoca el método Update.

El evento ClientDeletedDomainEvent se lanza cuando se elimina un cliente del sistema. Este es creado internamente en el agregado Client cuando se invoca el método Delete.

Aggregate
Section titled “Aggregate”El agregado Client es el componente principal del microservicio de Clientes. Contiene la lógica de negocio y las reglas de validación relacionadas (invariantes). En esta etapa, modificaremos el agregado Client para definir las propiedades debido a que ya ha sido creado por el generador CodeDesignPlus.Net.Generator.
-
Creamos las propiedades del agregado
Clientcon los valores por defecto.
-
Creamos el constructor privado del agregado
Clientpara evitar la creación de instancias sin los valores requeridos y asociamos el evento de dominioClientCreatedDomainEventa la instancia del agregado.
-
Usamos
name constructor patternpara crear una nueva instancia del agregadoClienty usamos guard clauses para validar las propiedades del cliente.
-
Creamos los métodos
UpdateyDeleteen el agregadoClientpara actualizar y eliminar la información del cliente, respectivamente.
Repositorio
Section titled “Repositorio”El SDK de CodeDesignPlus proporciona una clase base RepositoryBase que implementa los métodos CRUD básicos para interactuar con la base de datos. En esta etapa, no modificaremos la interfaz IClientRepository ni su implementación ClientRepository, ya que hereadamos de la clase RepositoryBase.
Si el RepositoryBase no cumple con tus necesidades, puedes modificar la interfaz IClientRepository y su implementación ClientRepository para agregar los métodos necesarios.

Comandos
Section titled “Comandos”Los comandos representan las acciones que los usuarios pueden ejecutar en nuestro microservicio. Por ello, comenzaremos modificando los commands y, posteriormente, ajustaremos los handlers asociados a cada uno. En esta etapa, recibiremos la información del comando, la validaremos y luego invocaremos el método correspondiente en el agregado Client. Finalmente, generaremos y lanzaremos los eventos de dominio correspondientes, los cuales serán creados internamente dentro del agregado.
-
El comando
CreateClientCommandrepresenta la acción de crear un nuevo cliente en el sistema. Contiene las propiedades necesarias para crear un nuevo cliente, comoName,LastName,EmailyAddress.
-
El handler
CreateClientCommandHandlerrecibe el comandoCreateClientCommand, valida la información del cliente y luego invoca el métodoCreateen el agregadoClient. Finalmente, genera y lanza el evento de dominioClientCreatedDomainEvent.
-
El comando
UpdateClientCommandrepresenta la acción de actualizar la información de un cliente en el sistema. Contiene las propiedades necesarias para actualizar un cliente, comoId,Name,LastName,EmailyAddress.
-
El handler
UpdateClientCommandHandlerrecibe el comandoUpdateClientCommand, valida la información del cliente y luego invoca el métodoUpdateen el agregadoClient. Finalmente, genera y lanza el evento de dominioClientUpdatedDomainEvent.
-
El comando
DeleteClientCommandrepresenta la acción de eliminar un cliente del sistema. Contiene la propiedadIdque identifica al cliente que se desea eliminar.
-
El handler
DeleteClientCommandHandlerrecibe el comandoDeleteClientCommand, valida la información del cliente y luego invoca el métodoDeleteen el agregadoClient. Finalmente, genera y lanza el evento de dominioClientDeletedDomainEvent.
Queries
Section titled “Queries”Las queries representan las consultas que otros microservicios pueden realizar para obtener información del microservicio de Clientes. En esta etapa, crearemos las queries GetAllClientQuery y GetClientByIdQuery para obtener información de un cliente específico o de todos los clientes, respectivamente.
-
La query
GetAllClientQueryrepresenta la acción de obtener información de todos los clientes en el sistema.
-
El handler
GetAllClientQueryHandlerrecibe la queryGetAllClientQueryy luego invoca el métodoFindAllen el repositorioClientRepositorypara obtener la información de todos los clientes.
-
La query
GetClientByIdQueryrepresenta la acción de obtener información de un cliente específico en el sistema.
-
El handler
GetClientByIdQueryHandlerrecibe la queryGetClientByIdQuery, valida si el registro existe en la cache. Si no existe, invoca el métodoFindAsyncen el repositorioClientRepositorypara obtener la información del cliente.
Controladores
Section titled “Controladores”Los controladores son responsables de recibir las peticiones HTTP e invocar los comandos o los queries correspondientes. En esta etapa, el controlador ClientController fue creado por el generador CodeDesignPlus.Net.Generator y se encarga de recibir las peticiones HTTP para crear, actualizar, eliminar y consultar información de los clientes.

Es importante documentar el controlador con C# XML Comments para que la documentación del API sea generada automáticamente.

Configuración Mapster
Section titled “Configuración Mapster”Mapster es una librería de mapeo de objetos que nos permite mapear fácilmente los objetos como nuestros commands, queries, aggregate, entities, value object a los DTOs y viceversa. En esta etapa, configuraremos Mapster para mapear los objetos en nuestra capa de aplicación.
Procedemos a configurar las siguientes clases de mapeo:
CreateClientDtoaCreateClientCommandUpdateClientDtoaUpdateClientCommandClientAggregateaClientDto

Compilación
Section titled “Compilación”Para asegurarnos de que nuestro microservicio de Clientes se compila correctamente, ejecutaremos el comando dotnet build en la raíz del proyecto. El resultado de la compilación se mostrará en la consola y se generará una carpeta bin con los archivos binarios necesarios para ejecutar el microservicio.

Conclusiones
Section titled “Conclusiones”En este tutorial, hemos aprendido cómo generar un microservicio de Clientes utilizando el generador codedesignplus:microservice y cómo modificarlo para adaptarlo a nuestras necesidades específicas. Hemos creado agregados, entidades, value objects, eventos de dominio, comandos, queries y controladores, y hemos configurado Mapster para mapear los objetos en nuestra capa de aplicación.