Un conjunto de bibliotecas para ayudar a los desarrolladores a implementar modelos de dominio en Java antiguo y sin distracciones.
Exprese explícitamente conceptos arquitectónicos para facilitar la lectura y escritura de código.
Mantenga el código específico del dominio libre de dependencias técnicas. Reducir el código repetitivo.
Genere documentación automáticamente y valide las estructuras de implementación y su arquitectura.
Haga la vida más fácil a los desarrolladores.
Expresar que un fragmento de código (un paquete, clase o método) implementa un concepto arquitectónico.
Facilite al lector humano la determinación de qué tipo de conceptos arquitectónicos es un fragmento de código determinado.
Permitir la integración de herramientas:
Aumento del código. (Ejemplos de herramientas: ByteBuddy con integraciones Spring y JPA).
Consulte las reglas arquitectónicas. (Ejemplos de herramientas: jQAssistant, ArchUnit).
Ejemplo: un dominio bancario.
import org . jmolecules . ddd . annotation .*;
@ Entity
class BankAccount {
@ Identity
final IBAN iban ;
/* ... */
}
@ ValueObject
class IBAN { /* ... */ }
@ ValueObject
record Currency { /* ... */ }
@ Repository
class Accounts { /* ... */ }
Cuando nos tomamos en serio el lenguaje ubicuo, queremos nombres (para clases, métodos, etc.) que solo contengan palabras del idioma del dominio. Eso significa que los títulos de los bloques de construcción no deben formar parte de los nombres. Entonces, en un dominio bancario no queremos BankAccountEntity
, CurrencyVO
o incluso AccountRepository
como tipos. En su lugar, queremos BankAccount
, Currency
y Accounts
, como en el ejemplo anterior.
Aún así, queremos expresar que una clase determinada (u otro elemento arquitectónico) es un bloque de construcción especial; es decir, utiliza un patrón de diseño. jMolecules proporciona un conjunto de anotaciones estándar para los bloques de construcción conocidos de DDD.
Como alternativa a las anotaciones mencionadas anteriormente, jMolecules también proporciona un conjunto de interfaces, basadas en gran medida en las ideas presentadas en la serie de John Sullivan "Advancing Enterprise DDD". Permiten expresar relaciones entre los bloques de construcción directamente dentro del sistema de tipos, de modo que el compilador puede ayudar a verificar la corrección del modelo y la información también puede procesarse mediante la reflexión de Java más fácilmente.
Identifier
: un tipo para representar tipos que se supone que actúan como identificadores.
Identifiable<ID>
: cualquier cosa que exponga un identificador.
Entity<T extends AggregateRoot<T, ?>, ID> extends Identifiable<ID>
: una entidad que declara a qué AggregateRoot
pertenece y qué identificador expone.
AggregateRoot<T extends AggregateRoot<T, ID>, ID extends Identifier> extends Entity<T, ID>
: una raíz agregada es una Entity
que se pertenece a sí misma y expone un Identifier
dedicado
Association<T extends AggregateRoot<T, ID>, ID extends Identifier> extends Identifiable<ID>
: una asociación explícita a un AggregateRoot
objetivo.
Esta disposición proporciona orientación para el modelado y permite verificar fácilmente las siguientes reglas, potencialmente mediante reflexión:
Tipos de identificadores dedicados y aplicados por agregado para evitar que se mezclen identificadores de diferentes agregados.
AggregateRoot
solo debe hacer referencia a instancias Entity
que fueron declaradas pertenecientes a ella.
AggregateRoot
s y Entity
s solo deben hacer referencia a otros AggregateRoots
a través de instancias Association
.
Para la verificación automatizada y la integración de la tecnología en tiempo de ejecución, consulte Integraciones de jMolecules.
jmolecules-ddd
: anotaciones e interfaces para expresar bloques de construcción DDD (objetos de valor, entidades, raíces agregadas, etc.) en el código.
jmolecules-events
: anotaciones e interfaces para expresar el concepto de eventos en código.
kmolecules-ddd
: versión de jmolecules-ddd
basada en Kotlin para mitigar los problemas de interoperabilidad de Kotlin/Java para el modelo basado en tipos.
jMolecules proporciona anotaciones para describir conceptos arquitectónicos de nivel superior siguiendo los estilos de arquitecturas en capas, tipo cebolla y hexagonales. Le permiten marcar un paquete completo como una capa, un anillo o uno que contiene puertos y adaptadores. Estos aparecerán en el archivo package-info.java
para cada paquete que desee anotar, por ejemplo:
package-info.java
para la capa de dominio: @ DomainLayer
package org . acmebank . domain ;
import org . jmolecules . architecture . layered .*;
package-info.java
para la capa de aplicación: @ ApplicationLayer
package org . acmebank . application ;
import org . jmolecules . architecture . layered .*;
De esa manera, todas las clases en el paquete respectivo se consideran parte de la capa o anillo anotado o se consideran un puerto/adaptador.
Alternativamente, las clases se pueden anotar directamente:
import org . jmolecules . architecture . layered .*;
@ DomainLayer
@ Entity
public class BankAccount { /* ... */ }
@ ApplicationLayer
@ Service
public class TransferMoney { /* ... */ }
Actualmente, existen anotaciones para arquitectura en capas, tipo cebolla y hexagonal.
jmolecules-architecture
: anotaciones para expresar estilos arquitectónicos en código.
jmolecules-cqrs-architecture
— Arquitectura CQRS
@Command
@CommandDispatcher
@CommandHandler
@QueryModel
jmolecules-layered-architecture
— Arquitectura en capas
@DomainLayer
@ApplicationLayer
@InfrastructureLayer
@InterfaceLayer
jmolecules-onion-architecture
— Arquitectura cebolla
Clásico
@DomainModelRing
@DomainServiceRing
@ApplicationServiceRing
@InfrastructureRing
Simplificado (no separa el modelo de dominio y los servicios)
@DomainRing
@ApplicationRing
@InfrastructureRing
jmolecules-hexagonal-architecture
— Arquitectura hexagonal
@Application
@(Primary|Secondary)Adapter
@(Primary|Secondary)Port
Las anotaciones e interfaces de jMolecules se pueden utilizar para generar el código técnico necesario para expresar el concepto en una determinada tecnología de destino.
Integración con Spring, Data JPA, Data MongoDB, Data JDBC y Jackson, para hacer que el código que utiliza anotaciones jMolecules funcione de manera inmediata en esas tecnologías.
Los conceptos de jMolecules expresados en código se pueden utilizar para verificar reglas que surgen de las definiciones de los conceptos y generar documentación.
Complemento jQAssistant: para verificar las reglas que se aplican a los diferentes estilos arquitectónicos, bloques de construcción DDD, CQRS y eventos. También crea diagramas PlantUML a partir de la información disponible en el código base.
Reglas de ArchUnit: permiten verificar las relaciones entre los bloques de construcción de DDD.
Spring Modulith: admite la detección de componentes jMolecules, bloques de construcción DDD y eventos para fines de documentación y modelo de módulo (consulte la documentación de Spring Modulith para obtener más información).
Para usar jMolecules en su proyecto simplemente declare una dependencia. Los binarios de versión están disponibles en el repositorio central de Maven. Para evitar tener que declarar todas las versiones explícitamente, recomendamos utilizar jmolecules-bom
en la sección de gestión de dependencias.
< dependency >
< groupId >org.jmolecules</ groupId >
< artifactId >jmolecules-ddd</ artifactId >
< version >1.9.0</ version >
</ dependency >
repositories {
mavenCentral()
}
dependencies {
implementation( " org.jmolecules:jmolecules-ddd:1.9.0 " )
}
mvn release:prepare -DscmReleaseCommitComment="$ticketId - Release version $version." -DscmDevelopmentCommitComment="$ticketId - Prepare next development iteration."
mvn release:perform -Dgpg.keyname=$keyname