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



创建聚合时,应该在聚合内部创建值对象,还是应该将已经创建的值对象传递给actor或factory。

 public Booking(DateTime arrivalDate, DateTime departureDate)
 {
      this.ArrivalAndDepartureinformation = new ArrivalAndDepartureInfo(arrivalDate, departureDate);
 }

 public Booking(ArrivalAndDepartureinformation arrivalAndDepartureInfo)
 {
            this.ArrivalAndDepartureinformation = arrivalAndDepartureInfo;
 }

实例化值对象在聚合或传递它作为参数?

  • 如果我们谈到将参数传递给构造函数,这取决于如何使用它。可能有一些基础设施限制需要使用基本类型。

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

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

值对象可以:

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

我的建议是:

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

例如:

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;
}

这样做:

public void Process(Email oldEmail, Email newEmail)
{
    Customer customer = GetCustomerByEmail(oldEmail);
    customer.Email = newEmail;
}

域模型应该使用域,而不是实现原语。

您的应用程序组件通常拥有获取原始数据并用模型语言表示它的责任。

最新更新