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
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?
- 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
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
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
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
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
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
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
Ahora que hemos generado el microservicio de Clientes, podemos comenzar a modificarlo para adaptarlo a nuestras necesidades específicas.
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
Address
Terminal window yo codedesignplus:microservice valueObject --valueObjects "Address" -
Modificamos la clase
Address
para definir las propiedades de la dirección del cliente, comoCountry
,State
,City
yAddressValue
. -
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
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
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
Client
con los valores por defecto. -
Creamos el constructor privado del agregado
Client
para evitar la creación de instancias sin los valores requeridos y asociamos el evento de dominioClientCreatedDomainEvent
a la instancia del agregado. -
Usamos
name constructor pattern
para crear una nueva instancia del agregadoClient
y usamos guard clauses para validar las propiedades del cliente. -
Creamos los métodos
Update
yDelete
en el agregadoClient
para actualizar y eliminar la información del cliente, respectivamente.
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
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
CreateClientCommand
representa la acción de crear un nuevo cliente en el sistema. Contiene las propiedades necesarias para crear un nuevo cliente, comoName
,LastName
,Email
yAddress
. -
El handler
CreateClientCommandHandler
recibe el comandoCreateClientCommand
, valida la información del cliente y luego invoca el métodoCreate
en el agregadoClient
. Finalmente, genera y lanza el evento de dominioClientCreatedDomainEvent
.
-
El comando
UpdateClientCommand
representa 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
,Email
yAddress
. -
El handler
UpdateClientCommandHandler
recibe el comandoUpdateClientCommand
, valida la información del cliente y luego invoca el métodoUpdate
en el agregadoClient
. Finalmente, genera y lanza el evento de dominioClientUpdatedDomainEvent
.
-
El comando
DeleteClientCommand
representa la acción de eliminar un cliente del sistema. Contiene la propiedadId
que identifica al cliente que se desea eliminar. -
El handler
DeleteClientCommandHandler
recibe el comandoDeleteClientCommand
, valida la información del cliente y luego invoca el métodoDelete
en el agregadoClient
. Finalmente, genera y lanza el evento de dominioClientDeletedDomainEvent
.
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
GetAllClientQuery
representa la acción de obtener información de todos los clientes en el sistema. -
El handler
GetAllClientQueryHandler
recibe la queryGetAllClientQuery
y luego invoca el métodoFindAll
en el repositorioClientRepository
para obtener la información de todos los clientes.
-
La query
GetClientByIdQuery
representa la acción de obtener información de un cliente específico en el sistema. -
El handler
GetClientByIdQueryHandler
recibe la queryGetClientByIdQuery
, valida si el registro existe en la cache. Si no existe, invoca el métodoFindAsync
en el repositorioClientRepository
para obtener la información del cliente.
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
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:
CreateClientDto
aCreateClientCommand
UpdateClientDto
aUpdateClientCommand
ClientAggregate
aClientDto

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
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.