C# DDD - 域对象创建
C# DDD - Domain Object Creation
我已经开始使用 C# 学习和创建带有事件源的 CQRS。我检查了很多示例,在每个示例中,在构造域对象时,所有必需的域字段要么使用构造函数传递,要么通过静态方法传递以创建域对象。
我是否应该将完整的 DTO 传递给域对象来构造它,而不是传递我从顶层获取的一长串单个字段?
public class Student : AggregateRoot
{
public int ID { get; set; }
public string Name { get; set; }
// Without ID and Name a domain object should not be created
//Can I write like this?
public Student(StudentDto studentDto)
{
ID = studentDto.ID;
Name = studentDto.Name;
}
//Can I write like this?
public Student(int id,string name)
{
ID = id;
Name = name;
}
}
DTO 在这里使用是错误的。您在 DTO 和域对象之间引入了一种不需要的联系,并且它们的演变方式不同。您可以想象域对象可能会进化为接受更多参数,或者 DTO 将需要更多属性。
一般来说,您应该在其构造函数中传递域对象需要的显式字段。如果您最终拥有一长串构造函数参数,则域对象可能具有太多责任,或者您可以使用构建器模式来减少所需的显式参数数量。
我认为这是解决 DDD 持久性问题的一种方法。
参见 https://vaughnvernon.co/?p=879,V. Vernon 也做了同样的事情。
我已经开始使用 C# 学习和创建带有事件源的 CQRS。我检查了很多示例,在每个示例中,在构造域对象时,所有必需的域字段要么使用构造函数传递,要么通过静态方法传递以创建域对象。
我是否应该将完整的 DTO 传递给域对象来构造它,而不是传递我从顶层获取的一长串单个字段?
public class Student : AggregateRoot
{
public int ID { get; set; }
public string Name { get; set; }
// Without ID and Name a domain object should not be created
//Can I write like this?
public Student(StudentDto studentDto)
{
ID = studentDto.ID;
Name = studentDto.Name;
}
//Can I write like this?
public Student(int id,string name)
{
ID = id;
Name = name;
}
}
DTO 在这里使用是错误的。您在 DTO 和域对象之间引入了一种不需要的联系,并且它们的演变方式不同。您可以想象域对象可能会进化为接受更多参数,或者 DTO 将需要更多属性。
一般来说,您应该在其构造函数中传递域对象需要的显式字段。如果您最终拥有一长串构造函数参数,则域对象可能具有太多责任,或者您可以使用构建器模式来减少所需的显式参数数量。
我认为这是解决 DDD 持久性问题的一种方法。
参见 https://vaughnvernon.co/?p=879,V. Vernon 也做了同样的事情。