Harici bir ERP, odeme saglayicisi veya legacy monolit ile entegrasyon kurarken en sik yapılan hata, dis sistemin veri modelini ve kavramlarini dogrudan ic domain modeline tasimaktir. Bir sure sonra Order aggregate odeme gateway JSON semasina, CRM alan adlarina ve EDI mesaj formatina bağımlı hale gelir. Domain dili kirilir; is kurallari harici degisikliklere açık olur. Eric Evans tarafindan tanimlanan Anti-Corruption Layer (ACL), bu kirlenmeyi onlemek icin bilincli bir çeviri katmanı oluşturur.
ACL amaci ve konumu
Anti-corruption layer, bounded context ile upstream veya downstream sistem arasinda duran bir çeviri ve adaptasyon katmanidir. Amac yalnizca JSON veya XML dönüşümü degildir; farklı ubiquitous language arasinda anlami koruyarak gecistirmektir. Dis sistemdeki SHIP_TO_ADDR_LINE_3 alani, domain tarafinda DeliveryAddress value object parcasi olabilir veya bilincli olarak yok sayilabilir.
Mimari diyagramda ACL genellikle infrastructure katmaninda yer alir. Application servisi IExternalInventoryGateway arayuzunu cagirir; implementasyon ACL icinde dis servisin ham modelini domain modeline cevirir. Domain ve application katmanları dis API varligindan habersiz kalir.
Upstream ve downstream perspektifi
Context mappingde ACL, downstream contextin upstream modeline karşı kendini korudugu durumlarda kullanılır. Upstream modeli kalitesiz, degisken veya kontrol disindaysa ACL zorunludur. Upstream güvenilir published language sunuyorsa conformist ilişki degerlendirilebilir.
Tasarım bilesenleri
Saglam ACL su parcalardan olusur:
- Gateway: Dis sisteme tek giriş noktasi; retry, timeout, circuit breaker burada.
- Translator: Dis DTO ile domain nesnesi arasinda dönüşüm.
- Validator: Dis verinin domain kurallarina uygunlugunu kontrol eder.
- Idempotency store: Tekrarlayan webhook veya mesajlarda cift işlem onleme.
public interface IPaymentGateway
{
Task<PaymentResult> CaptureAsync(CapturePayment command, CancellationToken ct);
}
public class StripeAntiCorruptionLayer : IPaymentGateway
{
public async Task<PaymentResult> CaptureAsync(CapturePayment command, CancellationToken ct)
{
var stripeRequest = _translator.ToStripe(command);
var stripeResponse = await _client.CaptureAsync(stripeRequest, ct);
return _translator.ToDomain(stripeResponse);
}
}
Domain tarafinda CapturePayment ve PaymentResult ubiquitous language yansitir. Stripe status kodlari domain PaymentStatus enumu ile temsil edilir.
Çeviri stratejileri
ACL çeviri iki yonlu dusunulmelidir:
- Inbound: Webhook, batch dosya veya API yaniti domain event veya commande donusur.
- Outbound: Domain komutu dis sistemin bekledigi formata yazilir.
Inbound sirasinda varsayilan degerler ve bilinmeyen alanlar politikalasir. Dis sistem yeni alan eklediginde domain kirlenmez; ACL güncellenir.
Rich model vs anemic DTO
ACL icindeki dis DTOlar bilincli anemic tutulabilir. Zenginlik domainde kalmalidir. Kritik is kurallari mapperda degil domain metodlarinda uygulanmalidir.
Legacy sistem entegrasyonu
ACL en güçlü kullanım alani legacy entegrasyondur. Eski mainframe sistemler anlamsiz alan adlari, sabit uzunluklu kayitlar ve tutarsiz tarih formatlari kullanır. ACL bu dunyayi modern domain modelinden soyutlar.
Strangler Fig deseni ile ACL, legacyden yeni servise geciste kritik rol oynar. Yeni özellikler yeni stack uzerinde geliştirilir; legacy yalnizca ACL uzerinden okunur ve yazilir.
Test stratejisi
- Translator unit testleri: Örnek dis payloadlar domain ciktisi ile eslesiyor mu?
- Contract testleri: Dis sistem sandboxinda API sozlesmesi degismemis mi?
- Integration testleri: WireMock veya test container ile uctan uca akis.
Domain testleri dis sistem mockuna ihtiyaç duymamalidir.
Performans ve güvenilirlik
ACL ek atlama katmanı oldugundan gecikme ve hata noktasi ekler. Maliyet genellikle domain butunlugunden daha degerlidir. Çeviri CPU-bound ise cache dusunulur. Büyük payloadlarda streaming parse tercih edilir. Timeout ve bulkhead pattern dis sistem cokmesinin ic sistemi bogmasini engeller.
ACL vs adapter vs facade
Adapter arayüz uyumsuzlugunu giderir. ACL adapter icerir ama ayrica semantik çeviri ve model koruma amaci tasir. Facade karmaşık alt sistemi basitlestirir. Domain koruma yoksa bu yalnizca integration adapterdir.
Yaygın hatalar
- ACL atlanip controllerda mapping yapmak.
- Domain entitylerine dis sistem attribute eklemek.
- Is mantigini ACLye tasimak.
- ACL olmadan shared kernel kullanmak.
Organizasyonel boyut
Domain uzmanlari çeviri kurallarini tanimlar; geliştiriciler implement eder. Hangi dis status hangi domain evente karşılık gelir sorusu dokumante edilmelidir.
Özet ilkeler
Anti-corruption layer dis dünya ile ic domain arasindaki anlamli sinirdir. Gateway, translator ve test stratejisi ile desteklendiginde harici sistem degisiklikleri kontrollu kalir. Domain koruma, ceviriyi tek yerde toplama ve dis modelin ic sisteme sizmasini engelleme ACLnin temel hedefleridir.
Pratik kontrol listesi
- Dis sistemin kavramlari domain dilimizle birebir eslesiyor mu?
- Dis API surumu ne siklikla degisiyor?
- Domain katmaninda dis sistem referansi var mi?
- Çeviri mantigi tek modulde mi toplanmis?
- Contract test pipelinea bağlı mi?
Bu sorularin çoğu belirsiz ise ACL tasarımı sarttir. Erken asamada atlanan ACL refactor maliyetini katlar.
Event-driven ACL
Mesaj tabanli entegrasyonda ACL, consumer tarafinda ham eventi domain evente cevirir. Schema registry ile sürüm uyumu izlenir. Geriye uyumsuz schema degisikligi consumer ACL guncellemesi gerektirir; domain etkilenmez.
Güvenlik sınırları
ACL dis kimlik bilgilerini ve PII maskelemesini de yonetebilir. Loglarda ham dis payload yerine sanitize edilmis özet tutulur. Güvenlik politikasi ACL katmaninda merkezi uygulanir.
Çoklu entegrasyon orchestrasyonu
Birden fazla dis sistem ayni use case icin cagrildiginda ACL orchestrator rolunu ustlenebilir. Örneğin envanter sorgusu hem legacy ERP hem yeni WMS uzerinden gelebilir; ACL hangi kaynagin otoriter oldugunu bilir ve sonucu tek domain modelinde birlestirir. Fallback ve cache politikasi ACL seviyesinde tanimlanir; domain yalnizca InventorySnapshot görür.
Feature flag ile dis sistem gecisi ACL uzerinden yapilir. Yeni saglayiciya geciste eski translator paralel çalışır; kademeli trafik kaydirma ACL test paketinde dogrulanir.
Observability
Her ACL çağrısı correlation ID, dis sistem adi, latency ve çeviri hatasi metrikleri ile izlenir. Dashboard dis sistem sagligini ve çeviri hata oranini gösterir. Incident analizinde ham dis payload yerine ACL log seviyesi kullanılır.