Нет ничего плохого в том, чтобы вызывать услугу у субъекта.Однако существуют некоторые проблемы, связанные с созданием этих служб.Если вы следуете по этому пути, вы должны каким-то образом получить экземпляр службы во время создания объекта, что проблематично.
Вызов конструктора напрямую - это явно плохая идея (поскольку он связывает сущность с реализацией сервиса).
Джимми Богард объяснил, почему внедрение услуг в сущности - плохая идея .
Вместо этого он предложил использовать шаблон ' double dispatch ' (было несколько споров, если это имя подходит) для решения этой проблемы.В этом подходе вызываемый метод домена обеспечивает реализацию сервиса для метода домена.В вашем случае это будет выглядеть примерно так:
class Foo {
String bar
public boolean verify(Service emailService) {
bar = "foo"
if(this.save()) {
emailService.sendConfirmation()
}
}
}
Foo.get(1).verify(new Service(...))
Последний (но не менее важный) вариант - использовать шаблон «События домена».Вы можете прочитать об этом в блоге Уди Дахана .При таком подходе сущности отвечают только за публикацию значимых событий, которые подписаны соответствующими обработчиками.Вы можете прочитать полное сравнение всех этих методов в моем блоге .
Надеюсь, что это поможет