Web应用程序中的实体和值对象
我们有一个简单的域模型:Contact,TelephoneNumber和ContactRepository。联系人是实体,它具有一个身份字段。 TelephoneNumber是典型的值对象:没有任何身份,因此无法与Contact实例分开加载。
另一方面,我们有用于处理联系人的Web应用程序。第一页是" ContactList",下一页是" Contact / C0001",其中显示了联系方式和电话号码列表。
我们必须执行电话号码编辑表格。第一种近似方法是添加一些可导航的页面,例如" ThelephoneNumber / T0001"。
但是ThelephoneNumber是Value Object类,因此无法通过这种方式识别其实例。
解决此问题的最佳实践是什么?我们如何识别无状态应用程序中的不可识别对象?
解决方案
回答
值对象状态是否标识该特定实例?如果不是,我们可以在提交编辑表单时仅传递旧值和新值,然后将具有旧状态的所有对象更新为新状态。
我希望有一个诸如Contact / C0001 / ThelephoneNumber之类的页面,并同时使用联系人ID和值对象类来标识要更改的实例。
除非我完全误解了要求。
回答
我将让TelephoneNumber仅包含一堆数字(也许使其为复数),并以这种方式引用它:Contact / C0001 / TelephoneNumber(s)
回答
在实践中,即使在设计上并非绝对必要,我总是会更容易给电话号码赋予一个标识。
如果它是不能在联系人上下文之外存在的严格值对象,则表明良好的用户界面可能要求在联系人页面(而不是其自己的页面)中编辑电话号码。
但是,如果我们决定不采用这两种方法中的任何一种,我认为Marc Gear的解决方案都是不错的选择。
回答
尽管许多人希望我们相信,但我们不能做到100%纯净。
价值对象需要某种身份字段。有时,对于某个对象(例如电话号码)来说,它将是唯一的,有时对于某些事物(如TelephoneNumber.Id)则必须是人造的。
我们越早接受这一点,对我们越好:-)