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:

Presentation

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.