Пусть служба приложения вызовет оба метода
Служба приложений, как правило, является отличной отправной точкой для этого, однако вы всегда должны пытаться изменить поведение как можно ближе к сущности. Служба приложения играет оркестрирующую роль и создает условия для выполнения поведения домена и, таким образом, обеспечивает все необходимые зависимости. Однако, когда это возможно, он должен делегировать поведение модели предметной области.
Используйте инъекцию метода / двойную диспетчеризацию для внедрения доменной службы в сущность, позволяя сущности делать свое дело, а затем позволяя ему вызывать метод доменной службы (или наоборот, позволяя доменной службе вызывать метод для сущности).
Это лучший подход, потому что большая часть поведения делегируется объекту или доменной службе. Наиболее несвязанный способ реализовать это состоит в том, чтобы объект выражал зависимость от службы в качестве параметра метода, обеспечивающего поведение под рукой.
Вызывает событие домена в методе объекта, обработчик которого вызывает службу домена.
Паттерн доменных событий, как объясняют Уди, а также сам Эванс, довольно универсален и может применяться в самых разных сценариях. Однако есть несколько осложнений. Во-первых, вы должны убедиться, что у вас есть правильная область видимости в издателе событий домена. В большинстве случаев у обработчиков событий вашего домена будут зависимости, и если вы используете контейнер IoC, вы должны убедиться, что в них вставлены правильные экземпляры. Например, в веб-приложении[ThreadStatic]
Атрибут проблематичен для определения объема. Другая сложность заключается в наличии границ транскрипции. Вы должны принимать во внимание транзакции, потому что если объект вызывает событие домена, но последующая фиксация в базе данных завершается неудачно, всем обработчикам событий домена потребуется способ отката, в противном случае вы в конечном итоге вызовете недопустимое событие. Однако, если у вас есть эти основы, то доменные события являются отличным шаблоном для инкапсуляции логики домена в самих сущностях.
Разница между подходом 2 и 3 зависит от варианта использования. Событие домена применяется, когда вы хотите вызвать дополнительное поведение в ответ на событие, которое находится в прошедшем времени . Это важное ограничение, так как обработчик событий домена не может влиять на поведение объекта. С другой стороны, при подходе 2 внедренный сервис потенциально может влиять на поведение, потому что он объявлен зависимостью для этого конкретного поведения.