【问题标题】:Reminders - DDD提醒 - DDD
【发布时间】:2020-04-30 23:53:30
【问题描述】:

即使领域模型中没有状态变化,业务提醒也可以建模为领域事件吗?

例如

向客户发送您的密码将在某某日期过期的通知?

向客户发送电子邮件,告知您应及时缴纳会费,否则将收取罚款(缴费提醒)

(我们通常会在截止日期前发送这些提醒)

【问题讨论】:

  • “SendReminder”是一个命令,至少它需要记录/保存提醒是在给定时间发送的事实。
  • 您甚至可以认为提醒逻辑是一个子域(隔离的或通用的),它具有适当的状态和聚合来处理跟踪和重试问题

标签: domain-driven-design domain-model


【解决方案1】:

发送提醒是一项服务Reminder 被发送的事实可以被捕获为 DomainEvent,但 Reminder 的实际发送要么是 ApplicationService 或 DomainService 取决于您的应用程序。

SendReminderService 应在到期前的特定时间点调用,因此您需要一个 Job Scheduler 来调用此 Service 以特定间隔发送或发送 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);
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    • 2018-10-12
    相关资源
    最近更新 更多