端口与适配器(Ports and Adapters):接口参数是否应使用领域对象?
端口参数类型选型结论
优先选择领域对象类型作为端口的参数定义,更符合六边形架构、整洁架构的核心设计原则。
核心原因
- 端口属于业务核心层的对外契约,本身的职责就是明确业务所需的输入标准,用领域对象可以直接从契约层面约束所有接入适配器必须提供符合业务规则的参数,避免不同适配器各自实现校验逻辑导致的规则不一致问题。
- 你提到的「领域模型变更时适配器要同步修改」的问题,用原始类型同样无法避免:比如业务侧修改了
FirstName的规则,要求长度从20字符改为15字符,就算端口用string类型定义参数,适配器侧也必须同步调整输入校验逻辑,无非是把规则校验的位置从传参前提到了适配器内部,反而更容易出现遗漏。 - 原始类型多出来的「入参转领域类型」的步骤属于冗余逻辑,还会增加转换出错的概率,也不符合依赖向内的架构原则:核心层不应该依赖外部传入的无规则原始类型,反过来应该是外部适配层依赖核心层定义的领域模型。
特殊场景适配
如果你的端口需要对外作为开放API对接异构外部系统,可以在最外层的接入适配层单独定义plain原始类型的入参结构做兼容,在适配层内部完成原始类型到领域对象的转换校验后,再调用核心层的端口,这一防腐层的设计不影响核心层端口本身用领域对象定义参数。
示例:核心层端口定义(始终用领域对象)
interface AddUser { firstName: FirstName lastName: LastName }
示例:开放API适配层的兼容入参定义(仅适配层使用)
// 仅在对外接入的适配层定义,不侵入核心层端口 interface AddUserOpenApiRequest { firstName: string lastName: string }
内容的提问来源于stack exchange,提问作者SuperJumbo
相关产品推荐
相关产品推荐

