DDD | 05-什么是端口和适配器架构?
适配器模式允许将不兼容的接口转换为另一个预期的接口,从而使原本由于接口不兼容而不能一起工作的类可以协同工作。
端口和适配器架构是一种设计思想,旨在通过明确区分应用程序的核心业务逻辑(领域层)与外部接口(输入/输出)和基础设施技术,来提高软件的灵活性、可测试下和可维护性。这种架构的核心思想是围绕领域模式构建,将外部交互抽象为"端口",并通过"适配器"来实现这些端口与外部世界的连接。
关键概念
端口(Ports)
领域端口
- 定义了领域模型与外部世界的交互接口,不涉及具体实现。这些端口可以是命令
Commands的入口,用于启动领域行为,或是查询Queries的出口,用于获取领域状态信息
基础设施端口
- 描述了领域模型对基础设施服务(如数据库、消息队列)的需求,通用是接口定义,没有具体实现
适配器(Adapters)
适配器是实现端口定义的桥梁,它们将领域模型与外部系统或基础设施技术细节隔离。
驱动适配器 Driving | Primary | Inbound Adapters
- 功能:负责接受外部输入(如用户界面的请求、外部API调用),并将这些输入转换为领域模型可以理解的命令或查询
- 作用:作为系统与外部世界的接口,将外部请求转换为领域内的操作,启动领域逻辑的执行
- 示例:Web控制器、API网关、消息监听器等
被驱动适配器 Driven | Secondary | Outbound Adapters
- 功能:负责执行领域模型操作之后的基础设施交互,如持久化数据到数据库、发送邮件或通知、记录日志
- 作用:确保业务逻辑执行的完整性和系统的可靠性
- 示例:ORM(对象关系映射)工具、邮件服务客户端、日志框架集成等
浅显解释
场景:餐厅运营
核心业务(领域层)
- 想象你经营一家餐厅,餐厅的核心是制作美味的食物和提供优质的服务,这就好比软件的领域层,关注的是业务的核心逻辑——创造价值的部分
前门与菜单(驱动端口)
- 顾客通过前门进入餐厅,看到的是菜单。菜单上列出的菜品和价格就像是软件的用户界面或API接口,是顾客与餐厅(系统)交互的第一步。顾客点菜的过程,就好比用户通过前端提交请求给系统
厨房与服务员(适配器)
- 驱动适配器:服务员扮演着驱动适配器的角色。他们接受顾客的点单(来自前门的请求),将这些请求转化为厨房能理解的指令(比如,将"一份牛排,全熟"转化为厨房内部的语言或流程)
- 被驱动适配器:厨房则是被驱动适配器,它根据服务员传来的质量,进行具体的操作(操作牛排、准备沙拉等),并将做好的菜肴通过服务员送回给顾客。同时,厨房还负责将一些操作的结果反馈给其他系统,比如记录订单到财务系统(类似于数据持久化)或通知清洁部门清理餐桌(类似日志或系统通知)
后厨与供应链(被驱动端口)
- 厨房需要的食材和材料,可以通过后厨的进货门(被驱动端口)获得,这涉及到与供应商的交互,比如订购新鲜蔬菜、肉类等。这些过程是餐厅运营的必要组成部分,但不是之恶面向顾客的,类似于软件中的数据访问、外部服务调用等
在这个例子中,餐厅的"前门"和"菜单"是与顾客交互的接口(驱动端口),服务员和厨房是适配器,负责转化和执行顾客的需求,同时厨房还通过"后厨门"与供应链交互(被驱动端口),确保运营的顺利进行。这样,餐厅的核心业务(制作美食和提供服务)就能保持独立,不受供应链变化或顾客点餐方式改变的影响,提高了系统的灵活性和可维护性。

浙公网安备 33010602011771号