Skip to main content

Rolü

Application katmanı, use-case orkestrasyonudur. İş kuralları Domain’de (aggregate’lar, value object’ler, domain servisleri) yaşar; Application bu kuralları bir senaryo etrafında düzenler:
  1. Gelen request’i (Command/Query) karşılar,
  2. Repository / domain servis / factory çağrılarını sıralar,
  3. Aggregate metodlarını tetikler (domain event’ler burada doğar),
  4. IUnitOfWork.SaveEntitiesAsync ile transaction’ı kapatır,
  5. Sonucu bir ResponseWrapper zarfı içinde döner.
Katman MediatR üzerine kuruludur ve CQRS ayrımını uygular: yazma tarafı IRepository<T> (write), okuma tarafı IReadRepository<T> (cache decorator) kullanır. Controller’lar incedir — sadece _mediator.Send(...) çağırır.
Application katmanı Infrastructure’a (DiyanetCleanArchitecture.Infrastructure.EFCore) referans verir; çünkü DependencyInjection.cs MassTransit Outbox’ı DiyanetCleanArchitectureDbContext üzerine register eder. İş mantığı yine de Domain’e bağımlıdır, altyapıya değil.

Klasör yapısı

DiyanetCleanArchitecture.Application/
├── Features/                    # Use-case'ler (CQRS) — Feature/Admin|Website/Commands|Queries
├── DomainEventHandlers/         # In-process INotificationHandler'lar (SaveEntitiesAsync sonrası)
├── IntegrationEventHandlers/    # Cross-instance / cross-service event tüketicileri
├── SeedWork/                    # Çapraz kesen altyapı
│   ├── PipelineBehaviors/       # MediatR IPipelineBehavior zinciri
│   ├── Authorization/           # IRequirePermissions, IRequireTenantAccess, ForbiddenException
│   ├── Security/                # ICurrentUser, ICurrentTenant, ICurrentActor, IRequirePermission
│   ├── Validations/             # FluentValidation custom validator'ları
│   ├── Mappings/                # AutoMapper IMapFrom<T> + MappingProfile
│   ├── Models/                  # ResponseWrapper, Paged, RequestWrapper, Export
│   ├── Caching/                 # Cache broadcast soyutlamaları
│   └── Exceptions/              # UndefinedApplicationException
├── Services/                    # Application-level servisler (Identity, File, Payment, ...)
└── DependencyInjection.cs       # AddApplication() — tüm kayıtlar

Features altında Admin / Website ayrımı

Her feature, hedef SPA’ya göre ikiye ayrılır. Aynı aggregate için Admin (back-office) ve Website (vatandaş portalı) farklı DTO, farklı yetki ve farklı specification kullanır:
Features/BagisBasvuruPlanlari/
├── Admin/
│   ├── Commands/   CreateBagisBasvuruPlan, UpdateBagisBasvuruPlan, DeleteBagisBasvuruPlan, ...
│   └── Queries/    GetAdminBagisBasvuruPlanlar, GetAdminBagisBasvuruPlanById
└── Website/
    └── Queries/    GetPublicBagisBasvuruPlanlar, GetPublicBagisBasvuruPlanById
Kimlik doğrulama feature’ı için ayrım Features/Authentication/Website/Commands/SignUpUser, .../VerifyOtp şeklindedir.

Request akışı

Bir Command/Query, Controller’dan MediatR’a girer, pipeline behavior zincirinden geçer ve Handler’a ulaşır. Handler aggregate’i değiştirir, IUnitOfWork SaveChanges yapar ve domain event’leri dağıtır. Pipeline sırası DependencyInjection.cs içinde kayıt sırasıyla belirlenir: Exception → Authorization → Validation → Permission. LoggingPipelineBehavior kayıtlıdır ama yorum satırına alınmıştır.
builder.Services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ExceptionPipelineBehavior<,>));
builder.Services.AddTransient(typeof(IPipelineBehavior<,>), typeof(AuthorizationPipelineBehavior<,>));
//builder.Services.AddTransient(typeof(IPipelineBehavior<,>), typeof(LoggingPipelineBehavior<,>));
builder.Services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ValidationPipelineBehavior<,>));
builder.Services.AddTransient(typeof(IPipelineBehavior<,>), typeof(PermissionPipelineBehavior<,>));
Cache MediatR pipeline’ında değildir. Okuma cache’i specification katmanında (.EnableCache(...)) işaretlenir ve CachedRepository<T> tarafından HybridCache’e bağlanır. Invalidation ise domain event handler’larında IHybridRequestCache.RemoveByTagAsync ile yapılır.

Sonraki adımlar

Command / Query deseni

SignUpUser, VerifyOtp ve admin query örnekleriyle CQRS akışı.

Pipeline Behaviors

Exception, Authorization, Validation ve Permission zinciri.

Validation & Mapping

FluentValidation custom kuralları ve AutoMapper convention’ı.

Domain Katmanı

Aggregate’lar, value object’ler ve domain event’ler.