【发布时间】:2020-07-13 15:17:03
【问题描述】:
在学习和实施领域驱动设计的同时,我正在开发一个约会计划系统。我已经确定了以下聚合根 - ScheduleDay。
public class ScheduleDay : Entity, IAggregateRoot
{
// Value Object - Full datetime and year, month, week, day values as integers
public Day Day { get; }
// Value Object - schedule for the day
public Schedule Schedule { get; }
// Other properties
private readonly List<Appointment> _appointments;
// Value Object - Appointments for the day
public IReadOnlyCollection<Appointment> Appointments => _appointments;
// Functions for adding/managing appointments and schedule day
}
ScheduleDay 表示单个日历日,包含创建和管理约会所需的信息和业务逻辑。
问题 - 如果我想以不同的时间表更新所有星期五怎么办?
据我所知和阅读,领域驱动设计声明您一次只能使用一个聚合。这意味着(除非我错了)您不能同时加载聚合集合并更新它们。即使可以 - 加载 Schedule Day Aggregates 的集合也可能会加载数千个约会,这会极大地影响性能,更不用说锁定数据库了。
可能的解决方案(1)
使 Schedule 成为它自己的聚合。一周中的每一天(例如星期五)都有自己的聚合根。然后我可以在 ScheduleDay 聚合中存储 Schedule 的 Id。
public class Schedule : Entity, IAggregateRoot { }
public class ScheduleDay : Entity, IAggregateRoot
{
public Guid Schedule { get; }
}
当我想更新星期五的日程时,我只会更新数据库中的 1 条记录。这个问题(?)是,如果我想进行新的约会,我必须首先从数据库加载日程安排,然后我需要加载日程安排日 - 两个 SQL 调用。
可能的解决方案(2)
使 Schedule Root Aggregate 和 ScheduleDay 成为一个实体。
public class Schedule : Entity, IAggregateRoot
{
public ScheduleDay ScheduleDay { get; }
}
public class ScheduleDay : Entity { }
因此,我担心聚合太大(具有子实体集合的子实体的根实体),我读过的所有材料都表明聚合应该尽可能小。
【问题讨论】: