将值对象传递给实体方法(就DDD而言)的良好做法? 例如,我的实体Customer中有一个方法:
SetAddress(Address invoiceAddress);
有效吗?或者我应该将地址参数作为
传递SetAddress(string street, string town, string zip, string country);
让客户处理地址对象的创建,如果需要抛出异常。
地址是不可变对象。
答案 0 :(得分:5)
您绝对应该传递Address
个对象。它在DDD方面是有效的,它也有利于可扩展性(即,您可以向Address
对象添加更多字段,而无需更改SetAddress
方法的签名。
同样,Address
对象应该包含地址信息的验证逻辑,Customer.SetAddress(...)
方法可以在设置地址之前执行:
public class Customer
{
public SetAddress(Address invoiceAddress)
{
// ToDo: Execute validation logic encapsulated in 'Address' object
// ToDo: Execute additional validation logic here
}
}
答案 1 :(得分:1)
从面向对象的角度来看,SetAddress()
的三个参数代表Address
,因此应该封装到Address
类的实例中。虽然我不确定为什么你有一个方法来执行SetAddress
,但你不能使用setter
吗?
如果您的SetAddress()
是公开的,那么该方法的调用者不必担心3个不连贯的字符串参数。更重要的是,通过查看函数名称无法确定参数的顺序(SetAddress()
不提供任何信息参数是否在顺序中:街道,城镇,邮编,国家或街道,城镇,国家,邮编)。调用者很容易混淆参数的顺序。
为避免出现这种情况,SetAddress()
最好接受其名称中明确指出的类型的参数,即Address
的实例。
答案 2 :(得分:0)
您可以将工厂方法作为地址
的一部分public class Address
{
public static Create(string street, string zip)
{
return new Address { Street = street, Zip = zip };
}
}
这个想法是Create
的参数显示了创建Address对象的强制属性。
var address = Address.Create("street", "zip");
customer.SetAddress(address);