DDD:在Aggregate中实例化Value对象或将其作为参数传递?

Rob*_*ert 5 domain-driven-design value-objects

在创建聚合时,我们是否应该在聚合中创建值对象,或者我们应该将已创建的值对象传递给ctor或factory.

 public Booking(DateTime arrivalDate, DateTime departureDate)
 {
      this.ArrivalAndDepartureinformation = new ArrivalAndDepartureInfo(arrivalDate, departureDate);
 }
Run Code Online (Sandbox Code Playgroud)

要么

 public Booking(ArrivalAndDepartureinformation arrivalAndDepartureInfo)
 {
            this.ArrivalAndDepartureinformation = arrivalAndDepartureInfo;
 }
Run Code Online (Sandbox Code Playgroud)

Ily*_*kin 7

在 Aggregate 中实例化 Value 对象还是将其作为参数传递?

  • 如果我们谈论将参数传递给构造函数,这取决于它是如何使用的。可能存在一些需要使用原始类型的基础设施限制。

  • 如果我们谈论将参数传递给方法,那么值对象是我 100% 的选择。

一般来说,我会说最好将值对象传递到您的聚合中

值对象可以:

  • 让你模特的语言更有表现力
  • 带来类型安全
  • 封装验证规则
  • 自己的行为

  • 因此,发送到应用程序服务的输入参数用于构造将发送到聚合工厂或构造函数的值对象 (2认同)

Vla*_*mir 6

我建议的一般准则是:

  • 在领域模型内部,尽可能多地使用值对象。
  • 在域模型(控制器、应用程序服务)的边界将原语转换为值对象。

例如,而不是这样:

public void Process(string oldEmail, string newEmail)
{
    Result<Email> oldEmailResult = Email.Create(oldEmail);
    Result<Email> newEmailResult = Email.Create(newEmail);

    if (oldEmailResult.Failure || newEmailResult.Failure)
        return;

    string oldEmailValue = oldEmailResult.Value;
    Customer customer = GetCustomerByEmail(oldEmailValue);
    customer.Email = newEmailResult.Value;
}
Run Code Online (Sandbox Code Playgroud)

做这个:

public void Process(Email oldEmail, Email newEmail)
{
    Customer customer = GetCustomerByEmail(oldEmail);
    customer.Email = newEmail;
}
Run Code Online (Sandbox Code Playgroud)