Skip to main content

Yaklaşım

Sistem Clean Architecture + DDD ilkeleriyle yapılandırıldı. Bağımlılıklar içeriye doğru akar: dış katmanlar iç katmanlara referans verir, iç katmanlar dış katmanları bilmez.

Katman sorumlulukları

Domain (DiyanetCleanArchitecture.Domain)

  • Aggregate root’lar (User, Citizen, Organization, Faq, Role, …)
  • Domain event’ler (UserCreatedDomainEvent, FaqCreatedDomainEvent, …)
  • Specification’lar (Ardalis.Specification üzerinden)
  • Domain Service’ler (aggregate’lara sığmayan iş kuralları)
  • Bağımlılık: sadece Domain.SharedKernel

Domain.SharedKernel (DiyanetCleanArchitecture.Domain.SharedKernel)

  • Value Object base (ValueObject)
  • Entity base (EntityBase<TId>, Entity, audit + soft-delete interface’leri)
  • Aggregate root marker (IAggregateRoot)
  • Tekil değer nesneleri (Email, Phone, FullName, OtpCode, TCKimlikNo)
  • Enumeration base (smart enum) ve DomainEvent base
  • Bağımlılık: sadece BuildingBlocks.Specification

Application (DiyanetCleanArchitecture.Application)

  • MediatR Command/Query/Handler (CQRS)
  • DomainEventHandler’lar (Application/DomainEventHandlers/<EventName>/<UseCase>DomainEventHandler.cs)
  • IntegrationEventHandler’lar
  • DTO + Mapping (AutoMapper, IMapFrom<T> convention)
  • Pipeline behavior’ları (Exception → Authorization → Validation → Permission)
  • Bağımlılık: Domain + Infrastructure.EFCore + tüm BuildingBlocks

Infrastructure

Birden çok proje:
ProjeSorumluluk
Infrastructure.EFCoreDbContext, migrations, audit interceptor, query filter, seed
Infrastructure.Jobs.HangfireRecurring/delayed background job orkestrasyonu (PostgreSQL storage)
Infrastructure.Services.OAuthGoogle / Meta / Keycloak OAuth2 + PKCE token exchange
Infrastructure.Services.AuthenticatorTOTP (Google Authenticator) üretim/doğrulama
Infrastructure.Services.EmailMailKit + Scriban şablonlu e-posta gönderimi
Infrastructure.Services.SmsNetGSM SMS gateway entegrasyonu
Infrastructure.Services.NotificationSSE tabanlı admin bildirim yayını

Presentation

ProjeSorumluluk
DiyanetCleanArchitecture.API.NET 10 Web API (Admin + Website + Public endpoint’leri)
Presentation.AdminReact 19 + Vite SPA — yönetim paneli (/admin)
Presentation.WebsiteReact 19 + Vite SPA — vatandaş portali (/)

BuildingBlocks

Yatay (cross-cutting) modüller. Hiçbiri Domain veya Application’a referans vermez; tersine, Application bunları kullanır. Detay: BuildingBlocks Overview.

Bağımlılık akışı — referans grafiği

Kuralın istisnası yok: Domain projesi using DiyanetCleanArchitecture.Infrastructure.* ifadesi göremez. Application bu kuralı koruyan tek katmandır.

DDD sınırları

Sistem tek bir bounded context içinde modellenir (Diyanet domeni). Aggregate boundary’leri:
  • User aggregate — personel (yönetim paneli kullanıcısı), role/permission graph
  • Citizen aggregate — vatandaş profili, kimlik bilgileri, OTP state
  • Organization aggregate — kurum hiyerarşisi
  • Faq aggregate — sıkça sorulanlar (ordering desteği)
  • Announcement / Center / Content — public modüller
Her aggregate kendi domain event’lerini yayınlar. Cross-aggregate koordinasyon Application katmanında, MediatR handler’lar üzerinden olur — Domain katmanı diğer aggregate’a doğrudan dokunamaz.

CQRS yaklaşımı

  • Command’lar state değiştirir; domain event yayınlar; outbox’a yazılır
  • Query’ler read-only; ek olarak HybridCache pipeline behavior’ı ile cache’lenebilir
  • Tek DB (read/write ayrımı yok); cache L2 read replikası rolü oynar

Sırada ne var?

Solution yapısı

Tüm .csproj projeleri ve referansları.

Bağımlılık akışı

Hangi katman hangini kullanır — detaylı grafik.

Tasarım kararları

Neden çift-realm? Neden Outbox? Neden HybridCache?

BuildingBlocks haritası

20 paylaşılan modülün her biri.