Microservice (CRUD)
Command: yo codedesignplus:microservice microservice --is-crud
Este comando se utiliza para crear la estructura base de un nuevo microservicio que sigue el patrón CRUD (Crear, Leer, Actualizar y Eliminar) de forma automatizada. Está diseñado para escenarios donde las operaciones principales son la gestión de datos persistentes.
Prerrequisitos
Section titled “Prerrequisitos”- Instalar Node.js y npm instalados.
- Instalar Yeoman (npm install -g yo).
- Instalar el generador codedesignplus:microservice.
Conceptos Clave
Section titled “Conceptos Clave”- CRUD: Es un acrónimo que se refiere a las cuatro operaciones básicas que se pueden realizar sobre datos persistentes: Create (Crear), Read (Leer), Update (Actualizar) y Delete (Eliminar). Los microservicios CRUD se centran en estas operaciones.
- Microservicio: Es una unidad de software autónoma y pequeña que realiza una función específica. En el contexto de un microservicio CRUD, esta función se centra en la gestión de datos.
- Arquetipo: El arquetipo base CodeDesignPlus.Net.Microservicepara la creación de microservicios en .NET, proporcionando una estructura de proyecto bien definida y buenas prácticas.
- Diseño Basado en Dominio (DDD): Aunque el enfoque principal es CRUD, los principios de DDD se aplican en la estructura del microservicio para la organización de la lógica de negocio.
Sintaxis del Comando
Section titled “Sintaxis del Comando”El comando yo codedesignplus:microservice microservice --is-crud tiene la siguiente sintaxis:
yo codedesignplus:microservice microservice \    --organization "<organization_name>" \    --microservice "<microservice_name>" \    --description  "<microservice_description>" \    --contact-name "<contact_name>" \    --contact-email "<contact_email>" \    --vault "<vault_name>" \    --is-crud \    --aggregate "<aggregate_name>" \    --enable-grpc \    --enable-async-workeryo codedesignplus:microservice microservice `    --organization "<organization_name>" `    --microservice "<microservice_name>" `    --description "<microservice_description>" `    --contact-name "<contact_name>" `    --contact-email "<contact_email>" `    --vault "<vault_name>" `    --is-crud `    --aggregate "<aggregate_name>" `    --enable-grpc `    --enable-async-worker--organization
Section titled “--organization”- Tipo: string
- Obligatorio: Sí
- Descripción: El nombre de la organización. Se utiliza para la organización del código y la gestión de los namespaces.
--microservice
Section titled “--microservice”- Tipo: string
- Obligatorio: Sí
- Descripción: El nombre del microservicio que se va a crear.
--description
Section titled “--description”- Tipo: string
- Obligatorio: Sí
- Descripción: Una descripción detallada del microservicio que proporciona un contexto claro sobre su propósito.
--contact-name
Section titled “--contact-name”- Tipo: string
- Obligatorio: Sí
- Descripción: Nombre de la persona de contacto responsable del microservicio.
--contact-email
Section titled “--contact-email”- Tipo: string
- Obligatorio: Sí
- Descripción: Email de contacto de la persona responsable.
--vault
Section titled “--vault”- Tipo: string
- Obligatorio: Sí
- Descripción: El nombre del vault para la gestión de secretos y configuraciones.
--is-crud
Section titled “--is-crud”- Tipo: boolean
- Obligatorio: No
- Descripción: Indica que el microservicio será un CRUD, generando la estructura básica para operaciones de gestión de datos.
--aggregate
Section titled “--aggregate”- Tipo: string
- Obligatorio: No
- Descripción: El nombre del agregado raíz del microservicio, esencial para la organización del dominio.
--enable-grpc
Section titled “--enable-grpc”- Tipo: boolean
- Obligatorio: No
- Descripción: Habilita la API gRPC para el microservicio, que ofrece un protocolo de comunicación de alto rendimiento.
--enable-async-worker
Section titled “--enable-async-worker”- Tipo: boolean
- Obligatorio: No
- Descripción: Habilita un worker asíncrono para el manejo de eventos y tareas en segundo plano, mejorando la escalabilidad.
Ejemplos de Uso
Section titled “Ejemplos de Uso”Este ejemplo crea un microservicio CRUD llamado users para gestionar usuarios en la plataforma de la organización acme.
yo codedesignplus:microservice microservice \    --organization "Acme" \    --microservice "User" \    --description "Microservicio para gestionar usuarios de la plataforma." \    --contact-name "Jane Doe" \    --contact-email "jane.doe@example.com" \    --vault "vault-acme" \    --is-crud \    --aggregate "User" \    --enable-grpc \    --enable-async-workeryo codedesignplus:microservice microservice `    --organization "Acme" `    --microservice "User" `    --description "Microservicio para gestionar usuarios de la plataforma." `    --contact-name "Jane Doe" `    --contact-email "jane.doe@example.com" `    --vault "vault-acme" `    --is-crud `    --aggregate "User" `    --enable-grpc `    --enable-async-workerSalida del comando en consola
Section titled “Salida del comando en consola”Tras ejecutar el comando, se generará la estructura base del microservicio CRUD users en la organización acme, con la siguiente salida en consola:

Directorios y Archivos Generados
Section titled “Directorios y Archivos Generados”Si exploramos el microservicio con VS Code, veremos la estructura de directorios y archivos generados:

- .dockerignore 
- .env 
- .gitignore 
- Acme.Net.Microservice.Users.sln 
- archetype.json 
- Directory- resources - docker-compose.yaml
- Directoryshared- grafana-dashboards.yaml
- grafana-datasources.yaml
- loki-config.yaml
- otel-config.yaml
- prometheus-config.yaml
- tempo-config.yaml
- Directorydashboards- 15983.json
- 17781.json
- 19924.json
- 19925.json
- default.yaml
 
- Directoryvault- config.sh
- entrypoint.sh
- full-access.hcl
 
- Directoryvault-config- credentials.json
 
 
 
- Directory- src - Directorydomain- DirectoryAcme.Net.Microservice.Users.Application- Acme.Net.Microservice.Users.Application.csproj
- Errors.cs
- Startup.cs
- Usings.cs
 
- DirectorySetup- MapsterConfig.cs
 
- DirectoryUser- DirectoryCommands- DirectoryCreateUser- CreateUserCommand.cs
- CreateUserCommandHandler.cs
 
- DirectoryDeleteUser- DeleteUserCommand.cs
- DeleteUserCommandHandler.cs
 
- DirectoryUpdateUser- UpdateUserCommand.cs
- UpdateUserCommandHandler.cs
 
- DirectoryDataTransferObjects- UserDto.cs
 
 
- DirectoryQueries- DirectoryGetAllUser- GetAllUserQuery.cs
- GetAllUserQueryHandler.cs
 
- DirectoryGetUserById- GetUserByIdQuery.cs
- GetUserByIdQueryHandler.cs
 
 
 
- DirectoryAcme.Net.Microservice.Users.Domain- Acme.Net.Microservice.Users.Domain.csproj
- Errors.cs
- Startup.cs
- UserAggregate.cs
- Usings.cs
- DirectoryDomainEvents- UserCreatedDomainEvent.cs
- UserDeletedDomainEvent.cs
- UserUpdatedDomainEvent.cs
 
- DirectoryRepositories- IUserRepository.cs
 
 
- DirectoryAcme.Net.Microservice.Users.Infrastructure- Acme.Net.Microservice.Users.Infrastructure.csproj
- Errors.cs
- Startup.cs
- Usings.cs
- DirectoryRepositories- UserRepository.cs
 
 
 
- Directoryentrypoints- DirectoryAcme.Net.Microservice.Users.gRpc- Acme.Net.Microservice.Users.gRpc.csproj
- appsettings.Development.json
- appsettings.json
- Program.cs
- Usings.cs
- DirectoryCore- DirectoryMapster- MapsterConfig.cs
 
 
- DirectoryProperties- launchSettings.json
 
- DirectoryProtos- user.proto
 
- DirectoryServices- UserService.cs
 
 
- DirectoryAcme.Net.Microservice.Users.Rest- Acme.Net.Microservice.Users.Rest.csproj
- appsettings.Development.json
- appsettings.json
- Dockerfile
- Program.cs
- Usings.cs
- DirectoryControllers- UserController.cs
 
- DirectoryCore- DirectoryMapster- MapsterConfig.cs
 
 
- DirectoryProperties- launchSettings.json
 
 
 
 
- Directory- tests - Directoryintegration- DirectoryAcme.Net.Microservice.Users.gRpc.Test- Acme.Net.Microservice.Users.gRpc.Test.csproj
- Usings.cs
 
- DirectoryProtos- user.proto
 
- DirectoryAcme.Net.Microservice.Users.Rest.Test- Acme.Net.Microservice.Users.Rest.Test.csproj
- Usings.cs
 
- DirectoryProperties- launchSettings.json
 
 
- Directoryload- load-rest.js
 
- Directoryunit- DirectoryAcme.Net.Microservice.Users.Application.Test- Acme.Net.Microservice.Users.Application.Test.csproj
- Usings.cs
 
- DirectorySetup- MapsterConfigTest.cs
 
- DirectoryAcme.Net.Microservice.Users.Default.Test- Acme.Net.Microservice.Users.Default.Test.csproj
- Usings.cs
 
- DirectoryValidations- AggregateTest.cs
- CommandsTests.cs
- DataTransferObjectTest.cs
- DomainEventTest.cs
- EntityTest.cs
- ErrorsTest.cs
- QueryTests.cs
- StartupTest.cs
 
- DirectoryAcme.Net.Microservice.Users.Domain.Test- Acme.Net.Microservice.Users.Domain.Test.csproj
- Usings.cs
 
- DirectoryAcme.Net.Microservice.Users.gRpc.Test- Acme.Net.Microservice.Users.gRpc.Test.csproj
- Usings.cs
 
- DirectoryCore- DirectoryMapster- MapsterConfigTest.cs
 
 
- DirectoryAcme.Net.Microservice.Users.Infrastructure.Test- Acme.Net.Microservice.Users.Infrastructure.Test.csproj
- Usings.cs
 
- DirectoryAcme.Net.Microservice.Users.Rest.Test- Acme.Net.Microservice.Users.Rest.Test.csproj
- Usings.cs
- Core
- DirectoryMapster- MapsterConfigTest.cs
 
 
 
- Directorytools- sonar.ps1
- sonar.sh
- update-packages.ps1
- update-packages.sh
- upgrade-assist.ps1
- upgrade-assist.sh
 
 
Resultados de la Ejecución
Section titled “Resultados de la Ejecución”La ejecución de este comando con los parámetros proporcionados generará la estructura base de un microservicio CRUD en la organización acme con el nombre users. El microservicio estará listo para ser personalizado y ampliado según las necesidades del proyecto.
Pero para comprender mejor el impacto de cada una de las opciones, veamos los resultados de la ejecución del comando:
--organization
Section titled “--organization”Flag: --organization "acme"
- 
Este parámetro establece el nombre de la organización a nivel de la solución (.sln) y para cada uno de los proyectos (.csproj) generados.  
- 
El valor del parametro tambien se refleja en los namespaces de los proyectos generados.  
- 
Por ultimo, tambien se ve reflejado en cada uno de los archivos appsettings.jsonde los proyectos de infraestructura en la propiedadBusiness. 
--microservice
Section titled “--microservice”Flag: --microservice "users"
- 
Este parámetro establece el nombre del microservicio a nivel de la solución (.sln) y para cada uno de los proyectos (.csproj) generados.  
- 
El valor del parametro tambien se refleja en los namespaces de los proyectos generados.  
- 
Tambien es usado en los archivos appsettings.jsonde los proyectos de infraestructura en multiples propiedades. 
- 
El nombre del microservicio tambien se refleja en el archivo config.shencargado de la configuración de Vault. 
--description
Section titled “--description”Flag: --description "Microservicio para gestionar usuarios de la plataforma."
- 
Este parámetro establece una descripción detallada del microservicio que se refleja en el archivo appsettings.jsonde los proyectos de infraestructura. 
--contact-name
Section titled “--contact-name”Flag: --contact-name "Jane Doe"
- 
Este parámetro establece el nombre de la persona de contacto responsable del microservicio, que se refleja en el archivo appsettings.jsonde los proyectos de infraestructura. 
--contact-email
Section titled “--contact-email”Flag: --contact-email "jane.doe@example.com"
- 
Este parámetro establece el email de contacto de la persona responsable del microservicio, que se refleja en el archivo appsettings.jsonde los proyectos de infraestructura. 
--vault
Section titled “--vault”Flag: --vault "vault-acme"
- 
Este parámetro establece el nombre del vault para la gestión de secretos y configuraciones, que se refleja en el archivo config.shencargado de la configuración de Vault. 
- 
El valor del parametro tambien se refleja en los archivos appsettings.jsonde los proyectos de infraestructura en la propiedadVault. 
--is-crud
Section titled “--is-crud”Flag: --is-crud
Este flag indica que el microservicio será un CRUD, generando la estructura básica para operaciones de gestión de datos con base en el agregado raíz especificado.
- 
A nivel de la capa de dominio, se generan los archivos (Domain Events and Repositories) necesarios para el agregado raíz user. 
- 
A nivel de la capa de aplicación, se generan los archivos (Commands, Queries and DTOs) necesarios para el agregado raíz user. 
- 
A nivel de la capa de infraestructura, se generan los archivos (Repositories) necesarios para el agregado raíz user. 
--aggregate
Section titled “--aggregate”Flag: --aggregate "user"
- 
Este parámetro establece el nombre del agregado raíz del microservicio, que se refleja en los archivos generados en la capa de dominio.  
--enable-grpc
Section titled “--enable-grpc”Flag: --enable-grpc
- 
Este flag habilita la API gRPC para el microservicio, generando el servicio con base en el agregado raíz user. 
--enable-async-worker
Section titled “--enable-async-worker”Flag: --enable-async-worker
- 
Este flag habilita un worker asíncrono para el manejo de eventos y tareas en segundo plano, mejorando la escalabilidad del microservicio.  
Consideraciones Adicionales
Section titled “Consideraciones Adicionales”- Utilizar el flag --is-crudes crucial para generar un microservicio siguiendo el patrón CRUD.
- Asegúrate de proporcionar una descripción clara para tu microservicio.
- Define bien tu agregado raíz (--aggregate) para organizar adecuadamente tu dominio.
- Considera habilitar gRPC y Workers (--enable-grpc,--enable-async-worker) según las necesidades de tu proyecto.
- Comprender el impacto de cada parámetro te ayudará a personalizar, extender, solucionar problemas y mantener tu microservicio de forma efectiva.
Enlaces Relacionados
Section titled “Enlaces Relacionados”- Documentación del arquetipo CodeDesignPlus.Net.Microservice
- Documentación del SDK CodeDesignPlus.Net.SDK
- Conceptos de DDD
- Yeoman
Conclusión
Section titled “Conclusión”El comando yo codedesignplus:microservice microservice --is-crud proporciona una forma rápida y automatizada de generar la estructura de un microservicio CRUD listo para ser personalizado. Utiliza las opciones disponibles para adaptar el microservicio a las necesidades específicas de tu proyecto.