Анти-коррупционный слой (ACL) — это архитектурный паттерн, который применяется для защиты внутренней доменной модели приложения от влияния внешних систем при интеграции.
Зачем нужен: Когда ваша система взаимодействует с другими (например, наследует данные и бизнес-логику из устаревшего ПО или сторонних сервисов), внешний контракт может меняться или содержать искажения. ACL позволяет изолировать внутреннюю модель от изменений, несовместимых с вашей бизнес-логикой.
Как реализовать: Вводятся дополнительные компоненты — адаптеры и фасады, которые трансформируют внешние данные/интерфейсы во внутренние объекты. Это могут быть сервисы, мапперы, специальные DTO-классы.
Пример на Python:
class ExternalOrder: def __init__(self, order_id, amount, created_at): self.order_id = order_id self.amount = amount self.created_at = created_at class InternalOrder: def __init__(self, id, total, timestamp): self.id = id self.total = total self.timestamp = timestamp class OrderAdapter: @staticmethod def from_external(external_order): return InternalOrder( id=external_order.order_id, total=external_order.amount, timestamp=external_order.created_at )
Здесь OrderAdapter изолирует внутреннюю систему от изменения структуры внешнего заказа.
Ключевые особенности:
Можно ли просто использовать слой мапперов POJO/DTO вместо полноценного ACL?
Нет, простые мапперы не защищают бизнес-логику и не являются адаптерами в полной мере. ACL — это целостный слой, который реализует защищённую интеграцию, в том числе контекстное преобразование команд, событий и бизнес-ошибок.
Сколько уровней преобразования допустимо использовать в ACL?
Столько, сколько нужно для обеспечения полной изоляции. Обычно это минимум два: преобразование структуры и маппинг бизнес-логики (например, статусы, коды ошибок и политики доступа).
Как правильно обрабатывать ошибки внешних систем в ACL?
ACL должен перехватывать и адаптировать внешние ошибки под внутренние exception-классы или коды статусов. Никогда не пробрасывайте напрямую ошибки сторонних систем внутрь своего приложения.