Atualmente, estou estudando o DDD e tenho algumas perguntas sobre como gerenciar repositórios com o DDD.
Na verdade, encontrei duas possibilidades:
Primeiro
A primeira maneira de gerenciar serviços que li é injetar um repositório e um modelo de domínio em um serviço de aplicativo.
Dessa forma, em um dos métodos de serviço de aplicativo, chamamos um método de serviço de domínio (verificando regras de negócios) e, se a condição for boa, o repositório será chamado em um método especial para persistir / recuperar a entidade do banco de dados.
Uma maneira simples de fazer isso pode 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))
}
// ...
}
}
O segundo
A segunda possibilidade é injetar o repositório dentro do domainService e usar apenas o repositório através do serviço de domínio:
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 agora, não sou capaz de distinguir qual é o melhor (se houver um) ou o que eles implicam no seu contexto.
Você pode me dar um exemplo onde um poderia ser melhor que o outro e por quê?