Actualmente estoy estudiando DDD y tengo algunas preguntas sobre cómo administrar los repositorios con DDD.
En realidad, he encontrado dos posibilidades:
El primero
La primera forma de administrar los servicios que he leído es inyectar un repositorio y un modelo de dominio en un servicio de aplicación.
De esta manera, en uno de los métodos de servicio de la aplicación, llamamos a un método de servicio de dominio (verificando las reglas de negocio) y si la condición es buena, el repositorio se llama a un método especial para persistir / recuperar la entidad de la base de datos.
Una forma simple de hacer esto podría ser:
class ApplicationService{
constructor(domainService, repository){
this.domainService = domainService
this.repository = repository
}
postAction(data){
if(this.domainService.validateRules(data)){
this.repository.persist(new Entity(data.name, data.surname))
}
// ...
}
}
Segundo
La segunda posibilidad es inyectar el repositorio dentro del dominioServicio, y usar el repositorio solo a través del servicio de dominio:
class ApplicationService{
constructor(domainService){
this.domainService = domainService
}
postAction(data){
if(this.domainService.persist(data)){
console.log('all is good')
}
// ...
}
}
class DomainService{
constructor(repository){
this.repository = repository
}
persist(data){
if(this.validateRules(data)){
this.repository.save(new Entity(data.name))
}
}
validateRules(data){
// returns a rule matching
}
}
A partir de ahora, no puedo distinguir cuál es el mejor (si hay uno mejor) o qué implican ambos en su contexto.
¿Me puede dar un ejemplo donde uno podría ser mejor que el otro y por qué?
fuente