> ## Documentation Index
> Fetch the complete documentation index at: https://docs.diyanet.pro/llms.txt
> Use this file to discover all available pages before exploring further.

# Bağımlılık Akışı

> Katmanlar arası referans yönü, izin verilen bağımlılıklar ve build sırası

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

```mermaid theme={null}
graph TD
    API[API]
    APP[Application]
    DOM[Domain]
    SK[Domain.SharedKernel]
    EFC[Infrastructure.EFCore]
    SVC[Infrastructure.Services.*]
    JOBS[Infrastructure.Jobs.Hangfire]
    BB[BuildingBlocks.*]

    API --> APP
    API --> EFC
    API --> SVC
    API --> JOBS
    API --> BB
    APP --> DOM
    APP --> SK
    APP --> BB
    EFC --> DOM
    EFC --> SK
    EFC --> BB
    SVC --> SK
    SVC --> BB
    DOM --> SK
    SK --> BB
```

## İ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)                                           |

<Warning>
  **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.
</Warning>

## 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`                                        |

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:

```text theme={null}
SharedKernel  →  Domain  →  Application
                     ↘  Infrastructure.EFCore / Services.*  ↗
                                    ↘  API  ↙
```

İç 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

<AccordionGroup>
  <Accordion title="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.
  </Accordion>

  <Accordion title="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](/data/dbcontext).
  </Accordion>

  <Accordion title="BuildingBlocks'tan Application'a referans">
    BuildingBlocks yatay ve uygulamadan habersizdir. Application onları kullanır, tersi olmaz.
  </Accordion>
</AccordionGroup>
