【发布时间】:2021-03-15 19:18:40
【问题描述】:
我正在尝试在我的项目中实现 DDD,但我遇到了性能问题,模型很简单:日历(聚合根)和约会
public class Calendar
{
public int Id { get; private set; }
public IList<Appointment> Appointments { get; private set; }
public void AddAppointment(Appointment appointment)
{
var anyOverlapping = Appointments.Any(a => a.Date.Hour == a.Date.Hour);
if (anyOverlapping)
{
throw new Exception();
}
// More validations according to the calendar
Appointments.Add(appointment);
}
}
public class Appointment
{
public int Id { get; private set; }
public DateTime Date { get; private set; }
public int CalendarId { get; private set; }
}
问题在于,使用 DDD 方法时,我必须在 manager/service 方法中加载整个约会集合。
public void AddAppointment(int calendarId, Appointment appointment)
{
var calendar = _context.Calendars
.Include(c => c.Appointments) // Here load all the records in memory, can be thousands
.FirstOrDefault(c => c.Id == calendarId);
calendar.AddAppointment(appointment);
_context.SaveChanges();
}
但是对于 no DDD 方法,管理器/服务方法是:
public void AddAppointment(int calendarId, Appointment appointment)
{
var anyOverlaping = _context.Appointments
.Where(a => a.CalendarId == calendarId)
.Any(a => a.Date.Hour == appointment.Date.Hour); // Don't load all the records into memory
if (anyOverlapping)
{
throw new Exception();
}
// More validations according to the calendar that belongs
_context.Appointments.Add(appointment)
_context.SaveChanges();
}
我怎样才能在继续使用 DDD 设计的同时继续发挥作用?
【问题讨论】:
标签: c# performance entity-framework aggregate domain-driven-design