1

我对如何使用 DDD 更新相关实体感到困惑。假设我有一个员工类和工作计划类。我应该如何更新某个员工的具体工作时间表?Employee 和 Workschedule 之间的关系是一对多的。下面是我使用的如何添加/更新某个工作计划的代码。

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?另外,我现在的想法 Workschedule 是一个值对象,但我将 ID 用于规范化目的

4

3 回答 3

0

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

另外,我现在的想法 Workschedule 是一个值对象,但我将 ID 用于规范化目的

这是层和模型混合时的结果。您不需要域中的 ID,但需要用于持久性的 ID。试图在一个模型中同时满足这两个要求并调用该模型域会导致一事无成。

于 2012-04-07T07:35:43.407 回答
0

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

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

于 2015-04-21T18:31:21.337 回答
0

你的模型应该是“POCO”类

CRUD 方法,例如......添加编辑将被视为“服务”或“存储库”的一部分

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

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);
于 2012-04-07T07:11:41.040 回答