如果您认为客户是域模型的一部分,那么拥有该对象的属性和操作是有道理的(尤其是在DDD的上下文中,但不仅限于此)。
话虽如此,我认为您所使用的示例是一个糟糕的示例,也是引起争论的原因。如果您在谈论持久性,那么客户通常不会“保存”自己;无论您使用哪种持久性工具。有道理的是,任何种类的持久性都应属于持久性层/分区。这通常是存储库模式背后的思路。**诸如Customer.UpgradeWarranty()或Customer.PromoteToPreferred()之类的方法使参数更清晰。
这也不会消除使用DTO的可能性。考虑一下您要将客户信息传递到远程服务的情况。对于客户而言,创建自己的DTO进行传输可能没有任何意义,这是体系结构上的考虑,但是可以在持久性或网络层/分区/代码/所拥有的内容中找到理由。在这种情况下,这样的对象可以具有如下所示的方法
public static CustomerDTO GetDTO(Customer c) { /* ... */ }
public static Customer GetCustomer(CustomerDTO cdto) { /* ... */ }
因此,总而言之,对域对象执行与域中逻辑操作一致的操作是非常有意义的。
Google对于“ Persistence Ignorance”问题进行了许多精彩的讨论(此SO问题及其接受的答案是一个不错的起点)。
**这与某些OR / M软件有些混淆,在其中您被迫从具有“保存”方法的持久性基类继承。