Гранулированные доменные события - PullRequest
0 голосов
/ 10 сентября 2018

Изначально мы использовали события Домена для обработки связи с внешними системами. Например, каждый раз, когда пользователь обновлял свой номер телефона ИЛИ свое имя, мы вызываем событие PhoneNumberUpdated И NameUpdated. Затем они обрабатываются обработчиками и отправляются в другие системы.

    public void SetName(Name name)
    {
        if (Name == name) return;
        (...)
        RaiseEvent(new NameUpdated(Id, name));
    }

    public void SetPhoneNumber(PhoneNumber number, PhoneNumberType type)
    {
        RaiseEvent(new PhoneNumberUpdated());
    }

Это прекрасно работает, если нам не нужно «агрегировать» события. Например, мы получили новое требование, чтобы мы отправляли одно электронное письмо, когда пользователь обновляет свое имя и / или номер телефона. С текущей структурой наши обработчики будут уведомлены несколько раз (один раз для каждого вызванного события), и это приведет к отправке нескольких электронных писем.

Делать наши мероприятия более общими, не кажется хорошим решением. Но тогда как бы мы агрегировали несколько событий, возникших в одной транзакции?

Thx Себ

1 Ответ

0 голосов
/ 10 сентября 2018

Я полагаю, что ваше новое требование не связано с вашим фактическим доменом.Ваш домен генерирует события, которые описывают то, что произошло.Уведомление пользователя, с другой стороны, является проекцией этого потока событий в форму электронной почты.Точно так же, как вы будете хранить свои требования к модели чтения отдельно от своего домена, вы также должны хранить это отдельно.

Простое решение состоит в том, чтобы записывать события, которые вас интересуют, в таблицу, а затем один раз в день по расписанию и отправлять по одному электронному письму для агрегата.

...