Напоминания - DDD - PullRequest
       53

Напоминания - DDD

0 голосов
/ 14 января 2020

Можно ли смоделировать бизнес-напоминания как события домена, даже если в модели домена нет изменений?

для примера.

Отправка клиенту уведомления о том, что срок действия вашего пароля истек такая-то дата?

Отправка электронных писем клиентам о том, что вы должны своевременно уплатить свои взносы, в противном случае будет взиматься штраф (Напоминание о платежных сборах)

(Мы обычно отправляем эти напоминания до истечения срока)

1 Ответ

2 голосов
/ 14 января 2020

Отправка Напоминание - это Служба . Тот факт, что Напоминание было отправлено, может быть зафиксирован как DomainEvent , но фактическая отправка Напоминание является либо ApplicationService , либо DomainService в зависимости от вашего приложения.

SendReminderService следует вызывать в указанные c моменты времени до истечения срока действия, поэтому вам потребуется Планировщик заданий , который будет вызывать эту службу через определенные интервалы c или отправлять SendReminderForTodayCommand .

. Вы можете смоделировать это, добавив концепцию Напоминание в явном виде и создание событий при отправке напоминания. Вам также понадобится ScheduleReminderService .

В примере с паролем вы можете запланировать Напоминание , когда Пользователь регистрируется и когда он меняет свое пароль.

Вот пример:

public class Reminder : Entity {

    public Details ReninderDetails { get; private set; }
    public Date SendAt { get; private set; }
    public bool WasSent { get; private set; }

    public void MarkAsSent() {

        WasSent = true;
        AddEvent(new ReminderSent(ReninderDetails));
    }
}

public class ScheduleReminderService {

    public void ScheduleReminder(Date remindAt) {

        var reminder = Reminder.ForDate(RremindAt);

        ReminderRepository.Add(reminder);
    }
}

public class SendRemindersService {

    public void SendReminders() {

        var reminders = ReminderRepository.GetScheduledReminders(Date.Today);

        foreach(var reminder in reminders) {          

            SendReminder(reminder);

            reminder.MarkAsSent();

            ReminderRepository.Save(reminder);
        }
    }
}
...