Obecnie studiuję DDD i mam pytania dotyczące zarządzania repozytoriami za pomocą DDD.
Właściwie spotkałem dwie możliwości:
Pierwszy
Pierwszym sposobem zarządzania usługami, które przeczytałem, jest wstrzyknięcie repozytorium i modelu domeny do usługi aplikacji.
W ten sposób, w jednej z metod usługi aplikacji, wywołujemy metodę usługi domeny (sprawdzanie reguł biznesowych), a jeśli warunek jest dobry, repozytorium jest wywoływane specjalną metodą w celu utrwalenia / odzyskania jednostki z bazy danych.
Prostym sposobem na zrobienie tego może być:
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))
}
// ...
}
}
Drugi
Drugą możliwością jest wstrzyknięcie repozytorium do wnętrza usługi domainService i korzystanie z repozytorium tylko za pośrednictwem usługi domeny:
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
}
}
Odtąd nie jestem w stanie rozróżnić, który jest najlepszy (jeśli jest najlepszy) lub co im to sugeruje w swoim kontekście.
Czy możesz podać mi przykład, gdzie jedno może być lepsze od drugiego i dlaczego?