知识卡片

组装器对象保持DTO与领域对象的双向独立

普通读书笔记卡

内容

数据传输对象天生不知道该怎么和领域对象打交道——这不是疏忽,而是有意为之:DTO要被部署在连接的两端(客户端和服务器端都要用同一个DTO类),如果让DTO依赖领域对象,就等于把领域模型的一部分拖到了客户端;反过来,领域对象也不该依赖DTO,因为接口格式一旦调整,DTO的结构就要跟着变,这种变化不该传导进领域模型内部。原则上,领域模型应当独立于外部接口,这条通用规则决定了DTO和领域对象之间不能有直接依赖关系——但两者之间显然又必须有数据搬运的桥梁,解法是专门建一个独立的组装器对象,它的唯一职责就是”从领域模型组装出一个DTO”或者”用一个DTO的数据去更新领域模型”,本质上是映射器模式的一种应用。这样设计还带来额外的灵活性:同一个DTO完全可以被多个不同的组装器对象共享——典型场景是同样的数据在不同使用情境下需要不同的更新语义,这时候只要各自实现一个组装器就够了,不需要为每种语义各造一个新的DTO类;反过来,DTO本身往往可以从一份简单的数据描述里自动生成,但组装器要处理的是”怎么把数据在两种不同的对象结构间转换”这种更复杂的逻辑,通常很难自动生成,需要手写。可迁移启发:当两个本该互相独立演化的模型(对外接口格式 vs 内部领域概念)之间需要频繁互相转换数据时,与其让其中一方直接依赖另一方,不如引入一个专职的转换层,把”转换”这件事本身当作一个独立的、可以按场景变化的职责——这样两端各自的变化都不会互相牵连。

参考来源

- 位置:《企业应用架构模式》第二部分"模式"之"第15章 分布模式"之"15.2.1 运行机制"(源文件:_epub-src/OEBPS/Text/000185.html) - 结论依据:原文说明"一个数据传输对象并不知道如何与领域对象相关联……数据传输对象不应依赖于领域对象。同样,领域对象也不应依赖于数据传输对象……有必要建立一个分离的组装器对象,它将负责从领域模型组装一个数据传输对象或者从一个数据传输对象更新领域模型。组装器是映射器模式的一个例子……可以同时有多个组装器对象共享同一数据传输对象",直接支撑本卡结论。 - 原始内容:作为一条通用的规则,领域模型应当独立于外部接口。为此,有必要建立一个分离的组装器对象……