Sto studiando DDD in questi giorni e sto avendo alcune domande su come gestire i repository con DDD.
In realtà, ho incontrato due possibilità:
Primo
Il primo modo di gestire i servizi che ho letto è quello di iniettare un repository e un modello di dominio in un servizio applicativo.
In questo modo, in uno dei metodi del servizio applicativo, chiamiamo un metodo di servizio di dominio (controllando le regole aziendali) e se la condizione è buona, il repository viene chiamato su un metodo speciale per mantenere / recuperare l'entità dal database.
Un modo semplice per farlo potrebbe essere:
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))
}
// ...
}
}
Secondo uno
La seconda possibilità è quella di iniettare il repository all'interno del domainService, invece, e utilizzare il repository solo attraverso il servizio di 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
}
}
Da ora, non sono in grado di distinguere quale sia la migliore (se ce n'è una migliore) o cosa implicano entrambe nel loro contesto.
Puoi fornirmi un esempio in cui uno potrebbe essere migliore dell'altro e perché?