更新相关实体 DDD

本文关键字:DDD 实体 更新 | 更新日期: 2023-09-27 18:30:30

我对如何使用DDD更新相关实体感到困惑。假设我有一个员工班和工作时间表班。我应该如何更新某个员工的特定工作时间表?员工和工作时间表之间的关系是一对多的。以下是我正在使用的代码,如何添加/更新某个工作时间表。

public class Employee 
{    
    public int EmployeeId { get; set; }
    public virtual ICollection<WorkSchedule> WorkSchedules { get; set; }
    public WorkSchedule AddWorkSchedule(WorkSchedule workSchedule)
    {
        this.WorkSchedules.Add(workSchedule);
        return workSchedule;
    }
    public WorkSchedule EditWorkSchedule(WorkSchedule workSchedule)
    {
        var originalWorkSchedule = this.WorkSchedules.FirstOrDefault(w => w.WorkscheduleId ==  workSchedule.WorkscheduleId);
        originalWorkSchedule.ClockIn = workSchedule.ClockIn;
        originalWorkSchedule.ClockOut = workSchedule.ClockOut;
        return originalWorkSchedule;
    }
}
public class WorkSchedule
{
    public int WorkScheduleId { get; set; }
    public DateTime ClockIn { get; set; }
    public DateTime ClockOut { get; set; }
    public int EmployeeId { get; set; }
}

这是对的吗?我是否正确遵循了 DDD?另外,我现在的想法工作时间表是一个值对象,但我出于规范化目的而放置和 ID

更新相关实体 DDD

你的模型应该是"POCO"类

克鲁德方法如..添加编辑将被视为"服务"或"存储库"的一部分

这是我刚刚想到的一个快速想法/它应该是什么样子及其用法..

IRepository repository { get; set; } //implement Interface and inject via IoC Container
//..usage
var employee = repository.GetEmployee(123); //get by id
//..new WorkSchedule
employee.WorkSchedules.Add(workSchedule);
var result = repository.Save(employee);

由于此处的所有内容都与 EF 相关,因此与 DDD 无关。如果代码按预期工作,那么没关系。但DDD与EF或任何其他ORM没有任何关系。您应该设计域对象,而不关心数据库或ORM。然后,在存储库中,您将域实体映射到将由ORM处理的持久性实体。

另外,我现在的想法工作时间表是一个值对象,但我出于规范化目的而放置和 ID

这是层和模型混合时的结果。域中不需要 ID,但需要 ID 来实现持久性。试图在一个模型中同时满足这两个需求并将该模型称为 Domain 是无济于事的。

EF 它不适用于 DDD,它太笨拙了。EF 适用于喜欢将 SQL 表映射到实体并像 ActiveRecord 反模式一样这样做的代码猴子,但在更聪明的开发人员开始称这是一种不好的做法之后,他们开始使用 ORM、实体并继续猴子编码。

过去 3 年来,我一直在努力使用 EF 让它以 DDD 的方式工作。它成功地抵抗并获胜。没有黑客,它是行不通的。对多关系仍然无法按预期工作,无法创建带有构造函数的实体,而不是公共属性等。