【问题标题】:C# DDD - Domain Object CreationC# DDD - 域对象创建
【发布时间】:2017-01-11 03:13:28
【问题描述】:

我已经开始使用 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;
    }
}

【问题讨论】:

  • 什么是AggregateRootStudentDto
  • 作为旁注,域模型不应该有关于 DTO 的知识。
  • AgfregateRoot 是我所有聚合的基类,StudentDto 只是一个将数据从我的服务层传输到其他层的类。如果域模型不应该对 dtos 有任何了解,那就解决了我的问题.我需要传递单个字段而不是完整的 dto。如果我错了,请纠正我。

标签: c# oop domain-driven-design cqrs


【解决方案1】:

在这里使用 DTO 是错误的。您在 DTO 和域对象之间引入了不受欢迎的链接,并且它们的发展方式不同。您可以想象域对象可能会演变为接受更多参数,或者 DTO 将需要更多属性。

通常,您应该在其构造函数中传递域对象所需的显式字段。如果您最终拥有一长串构造函数参数,则可能是域对象有太多的责任,或者您可以使用 Builder 模式来减少所需的显式参数的数量。

【讨论】:

  • 仍会出现明显的重叠,通常会引入自动映射器来缓解样板文件。
【解决方案2】:

我认为这是解决 DDD 持久性问题的一种方法。

参见https://vaughnvernon.co/?p=879,V. Vernon 也做了同样的事情。

【讨论】:

    猜你喜欢
    • 2011-04-03
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多