Skip to main content
Clean Architecture’ın temel kuralı: bağımlılıklar içe doğru akar. Dış katmanlar iç katmanlara referans verir; iç katmanlar dış katmanları bilmez.

Referans grafiği

İzin verilen bağımlılıklar

Altın kural: DiyanetCleanArchitecture.Domain projesi hiçbir zaman using DiyanetCleanArchitecture.Infrastructure.* göremez. Domain dışa bağımlılığı arayüz (port) ile ifade eder; somut implementasyon Infrastructure’da yaşar ve Program.cs’te DI ile bağlanır.

Bağımlılık inversiyonu (DIP) nasıl uygulanır?

Application bir altyapı yeteneğine ihtiyaç duyduğunda arayüzü kendisi (veya SharedKernel) tanımlar, implementasyonu Infrastructure verir: Böylece Application, somut Redis/RabbitMQ/SMTP sınıflarını değil, soyutlamaları kullanır; test edilebilirlik ve sağlayıcı değiştirilebilirliği kazanılır.

Domain saflığı (purity)

Domain ve SharedKernel’in dış dünyaya tek dokunuşu BuildingBlocks.Specification üzerinedir (Ardalis.Specification). Bu bilinçli bir tavizdir: sorgu tanımlarını (spec) Domain’de tutmak, repository imzalarını temiz tutar. Persistence detayı (EF Core) yine de Infrastructure’dadır.

Build sırası

MSBuild bağımlılık grafiğine göre sıralar:
İç katman değiştiğinde dış katmanlar yeniden derlenir; bu yüzden Domain/SharedKernel’de yapılan değişiklik en geniş etkiye sahiptir.

Sık yapılan hatalar

Bir aggregate içinde DbContext veya HTTP client kullanmaya çalışmak. Çözüm: ihtiyacı bir Domain Service arayüzüyle ifade et, implementasyonu Infrastructure’a koy.
EFRepository.SaveChangesAsync() bilinçli olarak exception fırlatır. Daima IUnitOfWork.SaveEntitiesAsync() kullanılır — domain event dispatch buna bağlıdır. Bkz. Veri Katmanı › DbContext.
BuildingBlocks yatay ve uygulamadan habersizdir. Application onları kullanır, tersi olmaz.