防腐层(Anti Corruption Layer)介绍

防腐层(ACL)是一种设计模式,源于领域驱动设计(DDD),用于隔离不同系统间的集成,确保模型转换适应使用者需求而非提供者。常见于新旧系统切换、微服务边界上下文集成和系统独立迭代。ACL通常通过Facade和Adapter模式实现,充当新旧系统或微服务之间的胶水代码,转换并传递数据模型。

防腐层(ACL):DDD(Eric Evans)中引入的模式, 用于隔离两个系统, 允许两个系统之间在不知道对方领域知识的情况下进行集成。

主要进行的是两个系统之间的model(模型)或者协议的转换, 并且最终目的是为了系统使用者的方便而不是系统提供者的方便, 进一步解释就是ACL尽量把系统提供者的模型转换为系统使用者的模型(而不引入中间第三者模型)

 

使用场景: 

  1. 新旧系统切换时, 有些新系统需要和旧系统打交道, 此时可以利用 防腐层隔离新旧系统。

  2. 微服务中多个边界上下文的领域知识需要共享, 可以利用防腐层隔离两个系统

  3. 一个大的系统由多个独立的小组进行维护,可能会出现有些系统重构为新系统,又要保持和其他系统的连接, 此时用防腐层做到独立迭代和兼容

 

ACL的接口:

  1. 提供一组Service

  2. 提供Entity

 

设计模式的实现:

  1. Facade

  2. Adapter

 

示意图:

 

(上图是新旧系统之间通过ACL来做隔离)

 

 

### 领域驱动设计 (DDD)防腐 (ACL) 的实现 #### 防腐的核心概念 防腐Anti-Corruption Layer, ACL)是一种用于保护领域模型免受外部系统不良影响的设计模式。它的主要职责是通过适配器或其他机制将外部系统的数据结构转换为当前系统可以使用的格式,从而保持领域模型的一致性和纯净性[^1]。 #### 防腐的典型应用场景 当一个系统需要与其他遗留系统、第三方 API 或其他微服务交互时,这些外部系统可能采用不同的数据模型或协议。为了防止这种差异污染内部领域模型,可以通过防腐进行隔离和转化。例如,在微服务架构中,不同限界上下文之间的通信往往依赖于防腐来确保一致性和灵活性[^3]。 #### 防腐的具体实现方式 以下是一个基于 Python 的简单示例,展示如何通过防腐处理来自外部系统的数据: 假设有一个外部系统返回的数据如下: ```json { "customer_id": 123, "name": "John Doe", "orders": [ {"order_id": 456, "product_name": "Laptop", "quantity": 1}, {"order_id": 789, "product_name": "Mouse", "quantity": 2} ] } ``` 而我们的领域模型期望接收的是经过标准化的对象形式。此时可以在防腐中定义相应的映射逻辑。 ##### 示例代码:Python 实现防腐 ```python class ExternalCustomerAdapter: def __init__(self, external_data): self.external_data = external_data def to_domain_customer(self): customer_id = self.external_data.get("customer_id") name = self.external_data.get("name") orders = [] for order in self.external_data.get("orders", []): order_id = order.get("order_id") product_name = order.get("product_name") quantity = order.get("quantity") domain_order = DomainOrder(order_id=order_id, product_name=product_name, quantity=quantity) orders.append(domain_order) return DomainCustomer(customer_id=customer_id, name=name, orders=orders) class DomainCustomer: def __init__(self, customer_id, name, orders=None): self.customer_id = customer_id self.name = name self.orders = orders or [] def __repr__(self): return f"DomainCustomer(id={self.customer_id}, name='{self.name}', orders={len(self.orders)})" class DomainOrder: def __init__(self, order_id, product_name, quantity): self.order_id = order_id self.product_name = product_name self.quantity = quantity def __repr__(self): return f"DomainOrder(id={self.order_id}, product='{self.product_name}', qty={self.quantity})" # 使用防腐 external_data = { "customer_id": 123, "name": "John Doe", "orders": [ {"order_id": 456, "product_name": "Laptop", "quantity": 1}, {"order_id": 789, "product_name": "Mouse", "quantity": 2} ] } adapter = ExternalCustomerAdapter(external_data) domain_customer = adapter.to_domain_customer() print(domain_customer) ``` 在这个例子中,`ExternalCustomerAdapter` 是防腐的一部分,负责将外部系统的原始数据转化为符合我们领域模型的标准对象 `DomainCustomer` 和 `DomainOrder`。这样即使外部系统的接口发生变化,只要调整防腐即可,无需修改核心领域逻辑[^1]。 #### 关键点总结 - **隔离外部复杂性**:防腐屏蔽了外部系统的细节,使领域模型专注于自身的业务逻辑。 - **促进模块化设计**:通过引入防腐,增强了系统的解耦能力,便于未来扩展和维护。 - **支持统一语言**:正如提到的,“ohs”与“acl”的命名体现了代码模型中的统一语言理念[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值