GO-DDD: plantilla de diseño impulsada por el dominio en Golang
Bienvenido a go-ddd , un repositorio de implementación/plantilla de referencia que demuestra el enfoque de diseño impulsado por el dominio (DDD) en Golang. Este proyecto tiene como objetivo ayudar a los desarrolladores y arquitectos a comprender la estructura DDD, especialmente en el contexto de GO, y cómo puede conducir a bases de código más limpias, más mantenibles y escalables.
Descripción general
El diseño dirigido por dominio es una metodología y un patrón de diseño utilizado para construir un software empresarial complejo conectando la implementación a un modelo en evolución. go-ddd muestra esto estableciendo un mercado simple donde Sellers pueden vender Products .
¿Por qué DDD?
- Lenguaje ubicuo : promueve un lenguaje común entre los desarrolladores y las partes interesadas.
- Aislamiento de la lógica del dominio : la lógica del dominio está separada de las capas de infraestructura y aplicación, promoviendo principios sólidos.
- Escalabilidad : permite transiciones de arquitectura de microservicios más fáciles.
Estructura de repositorio

-
domain : el corazón del software, que representa la lógica y las reglas de negocios.-
entities : objetos fundamentales dentro de nuestro sistema, como Product y Seller . Contiene lógica de validación básica.
-
application : Contiene operaciones específicas de casos de uso que interactúan con la capa de dominio. -
infrastructure : admite las capas superiores con capacidades técnicas como el acceso a la base de datos.-
db : acceso a la base de datos y modelos. -
repositories : implementaciones concretas de nuestras necesidades de almacenamiento.
-
interface : la capa externa que interactúa con el mundo exterior, como los puntos finales de API.-
api/rest : controladores o controladores para administrar solicitudes y respuestas HTTP.
Otros principios
- Dominio
- No debe depender de otras capas.
- Proporciona infraestructura con interfaces, pero no debe acceder a la infraestructura.
- Implementa la lógica y reglas de negocios.
- Ejecuta validaciones en entidades. Las entidades validadas se pasan a la capa de infraestructura.
- La capa de dominio establece los valores predeterminados de las entidades (por ejemplo, UUID para ID o marca de tiempo de creación). ¡No establezca los valores predeterminados en la capa de infraestructura o incluso la base de datos!
- No filtre objetos de dominio al mundo exterior.
- Solicitud
- El código de pegamento entre el dominio y la capa de infraestructura.
- Infraestructura
- Los repositorios son responsables de traducir una entidad de dominio a un modelo de base de datos y recuperarla. No se ejecuta aquí una lógica comercial.
- Implementa interfaces definidas por la capa de dominio.
- Implementa la lógica de persistencia como acceder a una base de datos Postgres o MySQL.
- Al escribir en el almacenamiento, lea los datos escritos antes de devolverlos. Esto asegura que los datos se escriban correctamente.
Mejores prácticas
- No devuelva entidades validadas de los métodos de lectura en el repositorio. En su lugar, devuelva el tipo de entidad de dominio directamente.
- Las validaciones pueden cambiar en el futuro, y no desea cambiar todos los datos en su base de datos.
- De lo contrario, no podrá leer datos de la base de datos que se escribió con una lógica de validación diferente.
- No ponga los valores predeterminados (por ejemplo, la marca de tiempo de tiempo actual o ID) en la base de datos. Establecerlos en la capa de dominio (¡fábrica!) Por varias razones:
- Es bastante peligroso tener dos fuentes de verdad.
- Es más fácil probar la capa de dominio.
- Las bases de datos pueden ser reemplazadas y no desea tener que cambiar todos sus valores predeterminados.
- Siempre lea la entidad después de escribir en la capa de infraestructura.
- Esto asegura que los datos se escriban correctamente, y nunca estamos operando con datos obsoletos.
-
find vs get :-
find los métodos pueden devolver nulo o una lista vacía. -
get métodos deben devolver un valor. Si no se encuentra el valor, arroje un error.
- Deleción: siempre use la eliminación suave. Cree una columna
deleted_at en su base de datos y configúrela en la marca de tiempo actual al eliminar una entidad. De esta manera, siempre puede restaurar la entidad si es necesario.
Empezando
- Clon este repositorio:
git clone https://github.com/sklinkert/go-ddd.git
cd go-ddd
go mod download
go run ./...
Contribuciones
¡Las contribuciones, los problemas y las solicitudes de funciones son bienvenidas! No dude en consultar la página de problemas.
Licencia
Distribuido bajo la licencia MIT. Vea la licencia para más información.