Referans grafiği
İzin verilen bağımlılıklar
| Katman | Şunlara referans verebilir | Şunlara veremez |
|---|---|---|
| Domain | SharedKernel | Application, Infrastructure, API |
| Domain.SharedKernel | BuildingBlocks.Specification | Domain, Application, Infrastructure |
| Application | Domain, SharedKernel, BuildingBlocks | API, doğrudan EF Core implementasyonu (arayüzler üzerinden) |
| Infrastructure.EFCore | Domain, SharedKernel, BuildingBlocks | Application iş mantığı, API |
| Infrastructure.Services.* | SharedKernel, BuildingBlocks | Domain iş kuralları, Application handler’ları |
| API | Application + tüm Infrastructure + BuildingBlocks | — (en dış katman) |
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:| Arayüz (Application / SharedKernel) | Implementasyon (Infrastructure) |
|---|---|
IRepository<T>, IReadRepository<T>, IUnitOfWork | EFRepository<T>, CachedRepository<T>, DiyanetCleanArchitectureDbContext |
IEmailService | EmailService (Services.Email) |
IOtpSmsService | OtpSmsService (Services.Sms) |
IEventBus | MassTransitEventBus (BuildingBlocks.EventBus.MassTransit.RabbitMq) |
IHybridRequestCache | HybridRequestCache (BuildingBlocks.Caching) |
IUserFactory, IUserUniquenessChecker | UserFactory, UserUniquenessChecker |
Domain saflığı (purity)
Domain ve SharedKernel’in dış dünyaya tek dokunuşuBuildingBlocks.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:Sık yapılan hatalar
Domain'den Infrastructure'a referans
Domain'den Infrastructure'a referans
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.
Handler içinde SaveChanges çağırmak
Handler içinde SaveChanges çağırmak
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'tan Application'a referans
BuildingBlocks'tan Application'a referans
BuildingBlocks yatay ve uygulamadan habersizdir. Application onları kullanır, tersi olmaz.