2016-09-06 66 views
5

创建聚合时,我们应该在聚集内创建值对象,还是应该将已创建的值对象传递给聚合器或工厂。DDD:在Aggregate中实例化Value对象还是将它作为参数传递?

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

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

这样的问题:你如何使用这些构造函数和在哪里这些构造函数的参数从何而来? –

回答

3

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

  • 如果我们谈论传递参数到构造函数,这取决于如何使用它。可能会有一些基础结构限制需要使用原始类型。

  • 如果我们谈论传递参数到方法中,Value Objects是我选择的100%。

在一般情况下,我会说最好是价值的物品传递到您的聚集

值对象可以:

  • 所做出的语言模型更具表现力
  • 带来的类型安全
  • 封装验证规则
  • 自己的行为
+1

因此,发送到应用程序服务的输入参数用于构造将发送到聚合工厂或构件的值对象 – Robert

+0

是的。你可以在你的模型中获得更少的参数,更具体的参数类型和更多表达性语言。 –

3

域模型应该讲域,而不是执行原语。

您的应用程序组件通常负责获取原始数据并以模型语言表达它。

2

的一般准则,我会建议是这样的:

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

例如,而不是这样的:

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; 
} 
相关问题