我有一个Agenda
持有 many Card
,并且 aCard
有 multipleDetailItem
持有一个像Email
,Phone
和 aLabel
所以,我可以这样做:
agenda = new Agenda()
oneCard = new Card()
item = new DetailItem(new Email("x@y.z"), new Label("Work")
oneCard.addItem(item)
agenda.addCard(oneCard)
按照规则,只能有一个具有“x@yz”值DetailItem
的Email
实例,因此如果您尝试使用该数据添加一个新项目,它将引发异常。
在我尝试更新DetailItem
. 我找不到让我觉得舒服的方法。
我试着从商业模式而不是实现细节的角度来思考,但我不能长时间搁置它们,它们进入了我喜欢或不喜欢的领域。
问题是我将拥有一个 REST 接口,并且我有两种做事方式。
/cards/<cardId>
使用新detailItems' array, fetch the
卡发送一个by ID, create a new
PUTwith the new data provided in the PUT, and sync the current
。- 将 PUT 发送到 /cards//items/,获取
Card
,找到DetailItem
,并以与选项 1 中相同的方式更新它
如果我选择选项 1,我必须DetailItem
从当前Card
中删除所有新选项中不存在的内容。这导致一些由 ORM 生成的 INSERT 查询和一些 DELETES。根本没有更新。
如果我选择选项 2,我将有许多 PUT 来更改多个项目,这根本不具备性能,它会导致我向其中引入一个 ID 字段,DetailItem
以便我可以识别它们,这引入了一些不属于领域!。
我发现的唯一选择是使用选项 1,并发送如下请求:
{
...
detailItems: [
{
type: "email",
oldValue: "x@y.z",
oldLabel: "Work",
newValue: "a@b.c",
newLabel: "Work",
}
]
}
所以我可以做这样的事情:
card = agenda.getCardIdentifiedBy(the_identifier)
for(itemUpdate in jsonData.detailItems)
itemClass = ValueClassMapper.from(itemUpdate.type) // "email" -> Email
oldItem = new DetailItem(new itemClass(itemUpdate.oldValue), new Label(itemUpdate.oldLabel))
newItem = new DetailItem(new itemClass(itemUpdate.newValue), new Label(itemUpdate.newLabel))
card.updateItemWith(oldItem, newItem)
但是,我不知道,也许我有一个错误的抽象有人可以帮忙吗?提前致谢!