Это Загадка электронной таблицы : делает номеронабиратель номер телефона, или номер телефона набирает себя по телефону ?
Вы могли бы найти Двойная Отправка быть интересным чтением, хотя излишество в Вашей ситуации, я считаю .
Единственный Принцип Ответственности часто противоречащий принципу OO из , Говорят, не Спрашивайте . Мое чувство на предмете колебалось, и я обосновался на следующих условиях, когда логика должна войти в объект области:
В Вашей ситуации, я выбрал бы против помещения вызова к сервису в объекте объекта, главным образом потому что сервис не кажется, что это связано с Вашим доменом, но более связанное с персистентностью. Объекты области должны быть связаны с доменными понятиями, и я не думаю сервис, который Вы дали, квалифицирует.
пример, где я думаю, называя сервис в объекте, мог бы быть приемлемым, был бы то, если бы Ваше приложение использовало сторонний сервер рабочего процесса для управления частями его состояния. По существу это Шаблон состояния с состояниями, определенными во времени выполнения.
я думаю, что приемлемо иметь domainObject.moveToNextState () (предполагающий, что этот код "имеет смысл" на Вашем повсеместном языке), называют сервис, который говорит с Вашим сервером, потому что сервер рабочего процесса управляет частью модели предметной области.
я добавлю, что DDD очень интересно со следующим язык домена. Вы слышите, что специалисты по проблемной области говорят, что "Пользовательское изображение находит, соответствует ли его печать ползунка тем в сервисе поставщика XYZ"? Или они говорят, что "Сервис поставщика XYZ, учитывая печать ползунка, указывает, существует ли та печать ползунка"? Пойдите с тем, который имеет большую часть смысла в Вашем домене.
еще Некоторые мысли (я думал об этой проблеме много, потому что это является центральным для разработки):
В книге Evans DDD, объект Учетной записи имеет методы как кредит (Сумма), дебет (Сумма), transferTo (Учетная запись, Сумма), и накопитесь (), но FundsTransferService имеет передачу (Учетная запись, Учетная запись, Сумма) метод. transferTo метод не называет сервиса, но просто обрабатывает логику, которая включает Учетные записи, как кредитование и дебетование правильных сумм.
FundsTransferService, в дополнение к координации, имеет свои собственные правила проверить, правила, которые не вписываются в Учетные записи. Точная сумма к кредиту или дебету могла бы вовлечь внешние стороны. Это делает неудобным для transferTo назвать сервис.
Один недостаток, который я вижу, - то, что разрешение Вашего объекта области к обслуживаниям вызовов может сделать его тяжелее для сериализации, или по крайней мере вызвать некоторые проблемы после сериализации его, когда кто-то с другой стороны называет ее сервисный метод (методы).
Если Вы позволяете Объекту Объекта назвать сервис, это выполняет два ролевых Объекта данных и Объект службы. Обычно каждый объект должен иметь на ответственности, не только в реализации, но также и в использовании.
В Вашем случае, непритязательный UserImage, кажется, и Изображение и Устройство распознавания ThumbPrint.