DDD:在 Aggregate 中实例化 Value 对象或将其作为参数传递?
DDD: Instantiate Value objects inside Aggregate or pass it as parameter?
创建聚合时,我们应该在聚合内部创建值对象,还是应该将已经创建的值对象传递给 ctor 或工厂。
public Booking(DateTime arrivalDate, DateTime departureDate)
{
this.ArrivalAndDepartureinformation = new ArrivalAndDepartureInfo(arrivalDate, departureDate);
}
或
public Booking(ArrivalAndDepartureinformation arrivalAndDepartureInfo)
{
this.ArrivalAndDepartureinformation = arrivalAndDepartureInfo;
}
领域模型应该讲领域,而不是实现原语。
您的应用程序组件通常负责获取原始数据并以模型的语言表达它。
Instantiate Value objects inside Aggregate or pass it as parameter?
如果我们谈论将参数传递给构造函数,这取决于它的使用方式。可能存在一些基础结构限制,可能需要使用原始类型。
如果我们谈论将参数传递给方法,那么值对象是我 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;
}
创建聚合时,我们应该在聚合内部创建值对象,还是应该将已经创建的值对象传递给 ctor 或工厂。
public Booking(DateTime arrivalDate, DateTime departureDate)
{
this.ArrivalAndDepartureinformation = new ArrivalAndDepartureInfo(arrivalDate, departureDate);
}
或
public Booking(ArrivalAndDepartureinformation arrivalAndDepartureInfo)
{
this.ArrivalAndDepartureinformation = arrivalAndDepartureInfo;
}
领域模型应该讲领域,而不是实现原语。
您的应用程序组件通常负责获取原始数据并以模型的语言表达它。
Instantiate Value objects inside Aggregate or pass it as parameter?
如果我们谈论将参数传递给构造函数,这取决于它的使用方式。可能存在一些基础结构限制,可能需要使用原始类型。
如果我们谈论将参数传递给方法,那么值对象是我 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;
}