ediverse Explorer la plateforme

À la une PEPPOL BIS Billing 3.0 L’obligation européenne d’e-invoicing arrive : France sept 2026, Belgique janv 2026, Allemagne 2025.

Anti-Corruption Layer

La frontière défensive qui empêche les concepts d'un système externe de polluer le modèle métier interne — une digue stratégique au DDD.

Problème

Un hub EDI moderne s'interface avec un ERP legacy SAP installé depuis 25 ans. Le modèle SAP utilise des codes propres : BUKRS pour société, WERKS pour usine, LFART pour type de livraison, état "E0008" pour « commande approuvée mais pas livrée ». Si le hub EDI laisse ces codes envahir ses services internes, chaque ligne de code métier doit connaître les codes SAP. Un changement de modèle ERP devient une refonte complète. Pire : le modèle EDIFACT du partenaire Walmart utilise d'autres codes, et le mélange des deux donne un modèle interne hybride incompréhensible.

Forces

  • Les modèles externes sont hors de notre contrôle. Vendor lock-in (SAP), partenaire commercial (Walmart), norme réglementaire (HL7 FHIR) — leur évolution suit leur agenda.
  • Les modèles externes ont 30 ans de dette. Codes cryptiques, valeurs spéciales, exceptions historiques : laisser fuiter dans le modèle interne pollue.
  • Plusieurs externes coexistent. SAP + Oracle EBS + Salesforce + 50 partenaires EDI : un modèle interne unique doit absorber tout sans en porter la signature.
  • La traduction a un coût. Performance (mapping par message), maintenance (table des correspondances), précision (pertes potentielles).

Solution

Construire un Anti-Corruption Layer entre le contexte interne et chaque système externe. L'ACL combine plusieurs patterns classiques : une Façade qui simplifie l'API externe, un Adapter qui adapte la signature technique, un Translator qui convertit les concepts métier. Tout ce qui sort de l'ACL vers le contexte interne parle l'ubiquitous language interne ; tout ce qui sort de l'ACL vers l'externe parle le langage de l'externe. L'ACL est la membrane.

┌────────────────────────────────┐
│  Bounded Context : Notre hub   │
│  domain.Invoice {              │
│    invoiceId, debtor,          │
│    creditor, lines[]           │
│  }                             │
└────────────────────────────────┘
              ▲
              │ Traducteur (Façade + Adapter + Translator)
              │
   ┌──────────┴──────────────────────────────────────┐
   │ Anti-Corruption Layer                           │
   │  - parser EDIFACT INVOIC D.96A                  │
   │  - mapping UN/EDIFACT codes ↔ enum interne      │
   │  - validation entrée vs schéma partenaire       │
   │  - traduction RFF SBDH ↔ champ interne          │
   └─────────────────────┬───────────────────────────┘
                         │
              ┌──────────▼──────────┐
              │  Partenaire EDI     │
              │  INVOIC D.96A brut  │
              │  + ses quirks       │
              └─────────────────────┘

Implémentation EDI

Cas concret : un hub EDI reçoit un INVOIC EDIFACT D.96A d'un partenaire Walmart. Le partenaire utilise des codes UN/EDIFACT pour « type d'unité d'emballage » et son propre numéro de TVA américain (EIN). L'ACL fait : (1) parsing EDIFACT structurel ; (2) validation contre le schéma D.96A et les contraintes Walmart Implementation Guide ; (3) mapping codes UN/EDIFACT vers énumérations internes ; (4) lookup EIN → ID partenaire interne ; (5) émet un événement InvoiceReceived dans le langage interne. Aucun service en aval n'a besoin de connaître l'EDIFACT. Si Walmart impose un nouveau qualifier en 2027, seul l'ACL est touché. Pareil côté SAP : un connecteur IDoc adapte les structures SAP en modèles internes. Sterling B2B Integrator est typiquement déployé comme ACL devant un SAP.

Anti-patterns

  • ACL squelettique. Une simple traduction littérale champ par champ : les concepts externes traversent avec un autre nom. La pollution est juste renommée.
  • ACL business logic. Y mettre des règles métier (« si creditTerm > 30 alors flagger ») duplique la logique du domaine interne, et le hub ACL devient un mini-domaine concurrent.
  • Pas d'ACL pour un partenaire stratégique. « Walmart est notre plus gros client, on s'aligne sur leur modèle » : le jour où on en ajoute un autre, on découvre que le modèle interne est en réalité celui de Walmart.
  • ACL bidirectionnel mal pensé. ACL pour entrée et pour sortie : les deux directions peuvent avoir des règles différentes. Préciser quel sens est défendu.

Patterns liés

Sources

  • Evans E.Domain-Driven Design, Addison-Wesley 2003. Chap. 14 §3 « Anti-corruption Layer ».
  • Microsoft Architecture Center — Anti-Corruption Layer pattern. learn.microsoft.com — ACL
  • Vernon V.Implementing Domain-Driven Design, Addison-Wesley 2013. Chap. 13 développe le pattern avec des exemples concrets de mapping ERP/CRM.
  • Strangler Fig + ACL (Fowler). La combinaison classique pour décommissionner progressivement un legacy via un ACL hub. martinfowler.com — StranglerFigApplication