Общепринятый механизм не позволяет доменным службам взаимодействовать с инфраструктурой - они обычно не работают с транзакциями и единицами работы.Они принадлежат к уровню модели домена вместе с агрегатами, обрабатывают сложные случаи использования, которые обычно включают в себя более одного агрегата, и должны быть лишены инфраструктурных проблем, включая постоянство и уведомления.
Службы приложений должны выполнять эту работу.Они должны вызывать уровень модели домена (либо в сервисы, либо в агрегаты), собирать измененные элементы и обрабатывать постоянство как транзакцию.
Из вашего примера вы, вероятно, должны рассматривать UserService
как службу приложенийвызовите factory method
в User Aggregate
, чтобы создать новый пользовательский объект, а затем сохраните его с помощью repository
.
Теперь к хорошей части:
Интересная схема, которую я использовал в прошлом, заключается в том, что уведомления (например, отправка электронных писем) рассматриваются как часть самой единицы работы.UoW не только фиксирует все изменения данных, но также отвечает за отправку «зарегистрированных» уведомлений.Вы только регистрируете / отправляете уведомления и позволяете UoW выполнять фактическую отправку после успешной фиксации.
Лучшим способом является публикация события с соответствующими деталями и использование подписчика.составить и отправить уведомление.