Web应用程序中的实体和值对象

时间:2020-03-05 18:55:56  来源:igfitidea点击:

我们有一个简单的域模型: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)则必须是人造的。

我们越早接受这一点,对我们越好:-)