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
DomainEventbase - 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:| Proje | Sorumluluk |
|---|---|
Infrastructure.EFCore | DbContext, migrations, audit interceptor, query filter, seed |
Infrastructure.Jobs.Hangfire | Recurring/delayed background job orkestrasyonu (PostgreSQL storage) |
Infrastructure.Services.OAuth | Google / Meta / Keycloak OAuth2 + PKCE token exchange |
Infrastructure.Services.Authenticator | TOTP (Google Authenticator) üretim/doğrulama |
Infrastructure.Services.Email | MailKit + Scriban şablonlu e-posta gönderimi |
Infrastructure.Services.Sms | NetGSM SMS gateway entegrasyonu |
Infrastructure.Services.Notification | SSE tabanlı admin bildirim yayını |
Presentation
| Proje | Sorumluluk |
|---|---|
DiyanetCleanArchitecture.API | .NET 10 Web API (Admin + Website + Public endpoint’leri) |
Presentation.Admin | React 19 + Vite SPA — yönetim paneli (/admin) |
Presentation.Website | React 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 projesiusing 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
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.