Domain driven design 提醒-DDD

Domain driven design 提醒-DDD,domain-driven-design,domain-model,Domain Driven Design,Domain Model,即使域模型中没有状态更改,业务提醒是否可以建模为域事件 例如 向客户发送您的密码将在某某日期过期的通知 向客户发送电子邮件,要求您及时支付会费,否则将收取罚款(会费提醒) (我们通常在截止日期前发送这些提醒)发送提醒是一项服务。提醒被发送的事实可以被捕获为域事件,但是提醒的实际发送是应用程序服务或域服务,具体取决于您的应用程序 应在到期前的特定时间点调用发送提醒服务,因此您需要一个作业计划程序,该计划程序可以在特定时间间隔调用此服务,也可以发送发送提醒或TodayCommand 您可以通过明确添

即使域模型中没有状态更改,业务提醒是否可以建模为域事件

例如

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

向客户发送电子邮件,要求您及时支付会费,否则将收取罚款(会费提醒)


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

发送提醒是一项服务。提醒被发送的事实可以被捕获为域事件,但是提醒的实际发送是应用程序服务域服务,具体取决于您的应用程序

应在到期前的特定时间点调用发送提醒服务,因此您需要一个作业计划程序,该计划程序可以在特定时间间隔调用此服务,也可以发送发送提醒或TodayCommand

您可以通过明确添加提醒的概念来对此进行建模,并在发送提醒时生成事件。您还需要一个日程提醒服务

在密码示例中,您可以在用户注册和更改密码时安排提醒

下面是一个例子:

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);
        }
    }
}

发送提醒是一项服务提醒被发送的事实可以被捕获为域事件,但是提醒的实际发送是应用程序服务域服务,具体取决于您的应用程序

应在到期前的特定时间点调用发送提醒服务,因此您需要一个作业计划程序,该计划程序可以在特定时间间隔调用此服务,也可以发送发送提醒或TodayCommand

您可以通过明确添加提醒的概念来对此进行建模,并在发送提醒时生成事件。您还需要一个日程提醒服务

在密码示例中,您可以在用户注册和更改密码时安排提醒

下面是一个例子:

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);
        }
    }
}

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