Хотел тут набросать пример простого домена и наткнулся на дилемму.
Обычная фриланс биржа. Термины брал из upwork. Кастомером постится Job и туда апплаятся фрилансеры. каждый со своей hourRate.
Поскольку хочется этим примером показать и Information hiding, не стал делать Freelancer::getHourRate(), а создание обьекта Proposal(Freelancer, HourRate, CoverLetter) возложил на фрилансера.
И тут вопрос. Для меня нормальный вариант, это когда Service(Application) Layer достает нужный агрегат рут, еще немного данных и делает один вызов метода агрегат рута(может я и не прав). попросить фрилансера создать обьект Proposal а потом добавить его в Job - это доменная логика в недоменном слое.
Остаются два варианта:
ИЛИ
В первом проблема такая, что Job знает все, что надо фрилансеру для создания Proposal. coverLetter например, ненужное для него знание.
Во-втором все ок, но в дальнейших операциях агрегат рутом всегда будет Job. И это напрягает.
Полный пример двух вариантов - https://gist.github.com/adelf/a3c8a88879c1a200122ca1dd5030ba9d
Обычная фриланс биржа. Термины брал из upwork. Кастомером постится Job и туда апплаятся фрилансеры. каждый со своей hourRate.
Поскольку хочется этим примером показать и Information hiding, не стал делать Freelancer::getHourRate(), а создание обьекта Proposal(Freelancer, HourRate, CoverLetter) возложил на фрилансера.
И тут вопрос. Для меня нормальный вариант, это когда Service(Application) Layer достает нужный агрегат рут, еще немного данных и делает один вызов метода агрегат рута(может я и не прав). попросить фрилансера создать обьект Proposal а потом добавить его в Job - это доменная логика в недоменном слое.
Остаются два варианта:
PHP:
final class Job
{
public function newProposal(Freelancer $freelancer, string $coverLetterMessage)
{
$this->proposals[] = $freelancer->makeProposal($coverLetterMessage);
}
}
PHP:
final class Freelancer
{
public function apply(Job $job, string $coverLetterMessage)
{
$job->newProposal(new Proposal($this, $this->hourRate, $coverLetterMessage));
}
}
Во-втором все ок, но в дальнейших операциях агрегат рутом всегда будет Job. И это напрягает.
Полный пример двух вариантов - https://gist.github.com/adelf/a3c8a88879c1a200122ca1dd5030ba9d