我们有一个简单的域模型:Contact,TelephoneNumber和ContactRepository。联系人是实体,它有一个身份字段。 TelephoneNumber是典型的值对象:没有任何标识,无法与Contact实例分开加载。
从另一方面来说,我们有用于操纵联系人的Web应用程序。第一页是“ContactList”,下一页是“Contact / C0001”,显示联系方式和电话号码列表。
我们必须实施电话号码编辑表格。第一个近似思想是添加一些可以像'ThelephoneNumber / T0001'那样导航的页面。
但ThelephoneNumber是Value Object类,它的实例无法通过这种方式识别。
解决此问题的最佳做法是什么?我们如何在无状态应用程序中识别不可识别的对象?
答案 0 :(得分:2)
值对象状态是否标识该特定实例?如果不是,您可以在提交编辑表单时传回旧值和新值,然后将具有旧状态的任何对象更新为新状态。
我希望有一个类似Contact / C0001 / ThelephoneNumber的页面,并使用联系人ID和值对象类来标识要更改的实例。
除非我完全误解了你的要求。
答案 1 :(得分:0)
我会让TelephoneNumber只包含一堆数字(可能会复数),并以这种方式引用它:Contact / C0001 / TelephoneNumber(s)
答案 2 :(得分:0)
在实践中,我总是觉得更容易给电话号码一个身份,即使在设计方面不是绝对必要的。
如果它是一个严格的值对象,它不能存在于联系人的上下文之外,则表示良好的用户界面可能要求在联系人页面中而不是在其自己的页面上编辑电话号码。
但是,如果您决定采用这两种方法中的任何一种,我认为Marc Gear的解决方案很好。
答案 3 :(得分:0)
尽管许多人都希望你相信,但你不能100%纯洁。
您的值对象需要某种Identity字段。有时它对于像电话号码这样的对象来说是独一无二的,有时它必须是人为的东西,比如TelephoneNumber.Id。
越早接受这一点,对你来说就越好: - )