In questi giorni sto studiando DDD e ho alcune domande su come gestire i repository con DDD.
In realtà, ho incontrato due possibilità:
Il 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 di servizio dell'applicazione, chiamiamo un metodo di servizio di dominio (controllo delle 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))
}
// ...
}
}
Il secondo
La seconda possibilità è quella di iniettare invece il repository all'interno di domainService e di utilizzare il repository solo tramite 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 è il migliore (se ce n'è uno migliore) o cosa implicano entrambi nel loro contesto.
Potete darmi un esempio di dove uno potrebbe essere migliore dell'altro e perché?