将值对象传递给实体方法

时间:2012-02-24 08:58:44

标签: c# domain-driven-design

将值对象传递给实体方法(就DDD而言)的良好做法? 例如,我的实体Customer中有一个方法:

SetAddress(Address invoiceAddress); 

有效吗?或者我应该将地址参数作为

传递
SetAddress(string street, string town, string zip, string country);

让客户处理地址对象的创建,如果需要抛出异常。

地址是不可变对象。

3 个答案:

答案 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);