DDD架构中assembler和converter的区别

简介: 在 DDD 四层架构模式中,assembler 和 converter 常用于对象转换,但两者在实际项目中的使用较为随意。本文从英文释义、语义区分和模型层区分三个方面探讨了两者的区别,建议按模型层区分,即 Interface 和 Application 层使用 assembler,Infrastructure 层使用 converter,以避免混淆和随意使用。此外,将转换代码抽离为独立方法有助于保持代码整洁和可测试性。

DDD四层架构模式中,各层的对象我们需要借助assembler或converter来进行转换,但在实际项目中assembler和converter大家使用都很随意,很多项目中每一层都建了一个assembler目录,里面有的是 XxooAssembler,有的是 XxooConverter,看着也没什么规范也不知道是根据啥定义出来的,所以萌生了想要一探这两者区别的想法。

英文释义

先从英文的含义上来寻找答案:

  • assembler:n.汇编程序,汇编器(将指令转变为机器码)、装配工
  • converter:n.转换器、(改变无线电信号的)变频器、变流器、整流器、使发生转化的人(或物)

这里从英文意思上似乎找不到区别的方法,assembler 虽然有将指令转变为机器码的含义,但开发中实际也不是拿来转换成机器码,和 converter 一样是拿来做对象之间的转换。

按语义区分

1、assembler

assembler(装配器)从语义上理解,装配强调的是将多个组合在一起形成一个完整的整体。比如把从不同数据源或者不同业务处理阶段获取到的零散的、相关的数据信息,按照特定的业务规则进行拼接、组装成一个符合领域业务场景要求的完整对象实例。


实际开发中例如在电商场景下,一个订单聚合根对象可能需要由订单信息、用户信息、物流信息等多个部分组成,assembler 的任务就是将这些各个信息装配成一个完整的订单聚合根对象,使得这个新的对象在领域层,能够进行后续的诸如订单计算、状态变更等业务逻辑处理。

2、converter

converter(转换器)的语义侧重于改变事物的表现形式或格式。侧重的是对单个对象(也可能是包含多个对象的集合,但主要针对整体的表现形式改变)的属性、数据结构等进行调整,以便让其能在不同的层次(如从领域层到表现层)、不同的系统(如从内部到外部)之间以更合适的形式进行传递、展示或交互。


还是比如在电商系统中,领域层有一个包含了详细用户信息(如姓名、年龄、性别、联系方式、收货地址等)的用户对象。当前端要在用户界面(UI)展示用户列表时,我们并不需要展示所有的这些信息,可能只需要展示用户名、头像,converter 的作用就是将这个领域层的用户对象进行转换、提取并重新组织相关属性,生成一个适合在 UI 层展示的视图对象。

按模型层区分

也有一种观点就是这两者属于不同的结构层,assembler 属于接口层和应用层,其作用是将前端参数、或领域对象转换成 DTO(数据传输对象),或将 DTO 转换回领域对象;converter 属于基础层,其作用是将领域对象转换成数据库DO对象,或将 DO 转换回领域对象。

两种区分方法似乎都有其合理性,但是按语义区分的方式实际在开发中很难明确区别出来,也就很容易造成后续开发者不明其理随意使用。这里个人感觉还是按照模型层来区分比较合理,实际开发中也大都是拿来做对象转换,Interface、Application层都定义成assembler,Infrastructure层定义成converter,这样容易区分也不会出现混在一起随意定义使用的情况。

还有在实际开发中,很多人可能偷懒喜欢直接将对象之间的转换代码写到业务逻辑里,这样一方面会造成方法越来越臃肿,另一方面也不方便单元测试和复用,所以这类转换代码还是很推荐通过 assembler、converter 抽离成单独的方法。

目录
相关文章
|
13天前
|
存储 前端开发 调度
Flux 与传统的 MVC 架构模式区别
Flux是一种用于构建用户界面的架构模式,与传统的MVC架构不同,它采用单向数据流,通过Dispatcher统一管理数据的分发,Store负责存储数据和业务逻辑,View只负责展示数据,使得应用状态更加可预测和易于维护。
|
21天前
|
存储 JavaScript 前端开发
Flux 架构模式和 Redux 区别
Flux架构模式和Redux都是前端状态管理工具,Flux强调单向数据流,通过Dispatcher分发Action到Store,再由View更新;Redux则简化了这一流程,使用单一的全局Store,通过Reducer纯函数处理状态变更,使状态管理更加集中和可预测。
|
1月前
|
存储 前端开发 API
DDD领域驱动设计实战-分层架构
DDD分层架构通过明确各层职责及交互规则,有效降低了层间依赖。其基本原则是每层仅与下方层耦合,分为严格和松散两种形式。架构演进包括传统四层架构与改良版四层架构,后者采用依赖反转设计原则优化基础设施层位置。各层职责分明:用户接口层处理显示与请求;应用层负责服务编排与组合;领域层实现业务逻辑;基础层提供技术基础服务。通过合理设计聚合与依赖关系,DDD支持微服务架构灵活演进,提升系统适应性和可维护性。
|
1月前
|
机器学习/深度学习 弹性计算 编解码
阿里云服务器计算架构X86/ARM/GPU/FPGA/ASIC/裸金属/超级计算集群有啥区别?
阿里云服务器ECS提供了多种计算架构,包括X86、ARM、GPU/FPGA/ASIC、弹性裸金属服务器及超级计算集群。X86架构常见且通用,适合大多数应用场景;ARM架构具备低功耗优势,适用于长期运行环境;GPU/FPGA/ASIC则针对深度学习、科学计算、视频处理等高性能需求;弹性裸金属服务器与超级计算集群则分别提供物理机级别的性能和高速RDMA互联,满足高性能计算和大规模训练需求。
|
3月前
|
机器学习/深度学习 算法 数据库
阿里云服务器架构区别解析:从X86计算、Arm计算到高性能计算架构的区别参考
在我们选择阿里云服务器的架构时,选择合适的云服务器架构对于提升业务效率、保障业务稳定至关重要。阿里云提供了多样化的云服务器架构选择,包括X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器以及高性能计算等。本文将深入解析这些架构的特点、优势及适用场景,以供参考和选择。
阿里云服务器架构区别解析:从X86计算、Arm计算到高性能计算架构的区别参考
|
3月前
|
存储 消息中间件 JSON
|
3月前
|
边缘计算 人工智能 物联网
传统架构与RISC-V架构有什么区别?
计算机架构的发展经历了多个阶段,从最早的CISC(复杂指令集计算机)到后来的RISC(精简指令集计算机)。RISC-V作为一种新兴的RISC架构,以其开放性和模块化设计受到广泛关注。
90 2
|
4月前
|
Kubernetes 关系型数据库 分布式数据库
PolarDB产品使用问题之PolarDB-X的架构形态有什么区别
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
3月前
|
BI
软件设计与架构复杂度问题之业务简单的系统不适合使用DDD架构如何解决
软件设计与架构复杂度问题之业务简单的系统不适合使用DDD架构如何解决
|
3月前
|
程序员
软件设计与架构复杂度问题之战略编程与战术编程的主要区别如何解决
软件设计与架构复杂度问题之战略编程与战术编程的主要区别如何解决