Warstwa antykorupcyjna (ACL) to wzorzec architektoniczny stosowany w celu ochrony wewnętrznego modelu domeny aplikacji przed wpływem systemów zewnętrznych podczas integracji.
Po co to potrzebne: Gdy Twój system współdziała z innymi (np. dziedziczy dane i logikę biznesową ze starego oprogramowania lub usług zewnętrznych), zewnętrzny kontrakt może się zmieniać lub zawierać zniekształcenia. ACL pozwala na izolowanie wewnętrznego modelu od zmian, które są niekompatybilne z Twoją logiką biznesową.
Jak zaimplementować: Wprowadza się dodatkowe komponenty — adaptery i fasady, które transformują dane/Interfejsy zewnętrzne na wewnętrzne obiekty. Mogą to być usługi, mapery, specjalne klasy DTO.
Przykład w Pythonie:
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 )
Tutaj OrderAdapter izoluje wewnętrzny system od zmiany struktury zewnętrznego zamówienia.
Kluczowe cechy:
Czy można po prostu używać warstwy mapowników POJO/DTO zamiast pełnoprawnej ACL?
Nie, proste mapery nie chronią logiki biznesowej i nie są adapterami w pełnym tego słowa znaczeniu. ACL to całościowa warstwa, która realizuje zabezpieczoną integrację, w tym kontekstowe przekształcanie komend, zdarzeń i błędów biznesowych.
Ile poziomów przekształcania można użyć w ACL?
Tak wiele, jak to konieczne, aby zapewnić pełną izolację. Zwykle to minimum dwa: przekształcenie struktury i mapowanie logiki biznesowej (np. statusy, kody błędów i polityki dostępu).
Jak poprawnie obsługiwać błędy zewnętrznych systemów w ACL?
ACL powinien przechwytywać i dostosowywać zewnętrzne błędy do wewnętrznych klas wyjątków lub kodów statusu. Nigdy nie przekazuj bezpośrednio błędów zewnętrznych systemów do swojego aplikacji.