Skip to main content
Domain katmanı sistemin kalbidir: iş kuralları, davranışlar ve değişmezler (invariant) burada yaşar. Hiçbir framework, veritabanı ya da HTTP detayına bağımlı değildir. CQRS handler’ları, EF Core yapılandırmaları ve servisler hep bu çekirdeğin etrafında konumlanır. İki proje vardır:
  • DiyanetCleanArchitecture.Domain — aggregate’ler, domain event’ler, factory ve domain service’ler.
  • DiyanetCleanArchitecture.Domain.SharedKernel — DDD yapı taşları (Entity, ValueObject, Enumeration, DomainEvent), guard yardımcıları ve paylaşılan value object’ler.
Bağımlılık yönü tek taraflıdır: Domain yalnızca SharedKernel’e bağımlıdır. SharedKernel ise sadece MediatR (INotification için) ve Ardalis.Specification (repository arayüzleri için) gibi minimal paketlere dayanır. Domain, Application/Infrastructure’a asla bağımlı değildir.

DDD yapı taşları

Entity

Kimliği (Id) olan, yaşam döngüsü boyunca takip edilen nesneler. Entity : EntityBase<Guid>.

Value Object

Kimliği olmayan, değerine göre eşitlenen, değişmez (immutable) nesneler. FullName, Email, Phone.

Aggregate Root

Tutarlılık sınırı. Dışarıdan yalnızca root üzerinden erişilir. IAggregateRoot marker arayüzü ile işaretlenir.

Domain Event

Aggregate içinde olup biteni anlatan olaylar. DomainEvent + INotification. AddDomainEvent ile yayılır.

Enumeration

Tip-güvenli, davranış taşıyabilen sabit küme (enum yerine). UserStatus, Role, OtpType.

Factory / Domain Service

Karmaşık oluşturma ve tek aggregate’e sığmayan iş kuralları. IUserFactory, UserRegistrationService.

Klasör yapısı

DiyanetCleanArchitecture.Domain/
├── AggregatesModel/              # Her aggregate kendi klasöründe
│   ├── UserAggregate/
│   │   ├── User.cs               # Aggregate root
│   │   ├── UserSession.cs        # Çocuk entity
│   │   ├── UserOtpChallenge.cs
│   │   ├── UserIdentityProvider.cs
│   │   ├── UserRole.cs
│   │   ├── UserStatus.cs         # Enumeration
│   │   └── Specifications/       # Ardalis.Specification sorguları
│   ├── CitizenAggregate/
│   ├── OrganizationAggregate/    # Organization + Branch + StaffMember
│   ├── BagisBasvuruAggregate/
│   └── ...
├── Events/                       # Tüm domain event'ler
│   ├── UserCreatedDomainEvent.cs
│   ├── BagisBasvuruOnaylandiDomainEvent.cs
│   └── ...
├── Factories/                    # IUserFactory / UserFactory, ICitizenFactory
└── Services/                     # IUserUniquenessChecker, UserRegistrationService

DiyanetCleanArchitecture.Domain.SharedKernel/
├── SeedWork/                     # EntityBase, ValueObject, Enumeration, DomainEvent...
├── ValueObjects/                 # FullName, Email, Phone, OtpCode, TCKimlikNo...
├── Enumerations/                 # OtpType, AuthProviderType, City...
└── Utils/                        # Check (guard), GuidFactory, MobilePhoneUtility...
Her aggregate kendi klasöründe kapalı bir paket gibi durur: root, çocuk entity’ler, o aggregate’e özgü enumeration’lar ve Specifications/ alt klasörü. Yeni bir aggregate eklerken bu deseni birebir takip edin.

Aggregate listesi

AggregateRoot türüKısa açıklama
UserEntity, IAggregateRootPersonel (back-office) kullanıcısı. OTP, TOTP, oturum, rol, dış IdP.
CitizenEntity, IAggregateRootVatandaş portal kullanıcısı. User’a paralel ayrı aggregate.
OrganizationEntity, IAggregateRootKurum/tenant. Çocuklar: Branch, StaffMember, StaffPermission.
RolePermissionEntity, IAggregateRootRol–izin eşlemesi (RBAC).
AnnouncementEntity, IAggregateRootDuyuru. Kapak görseli (AnnouncementImageInfo).
BagisBasvuruEntity, IAggregateRootBağış başvurusu. State machine + status history.
BagisBasvuruPlanEntity, IAggregateRootBağış planı (başvuru şablonu).
EtkinlikBasvuruEntity, IAggregateRootEtkinlik başvurusu. State machine + kontenjan.
EtkinlikBasvuruPlanEntity, IAggregateRootEtkinlik planı.
SupportTicketEntity, IAggregateRootDestek talebi. Yorum, ek, durum geçmişi.
AdminNotificationEntity, IAggregateRootAdmin bildirimi (SSE yayını).
LegalDocumentEntity, IAggregateRootYasal metin + versiyon (LegalDocumentVersion).
FaqEntity, IAggregateRootSık sorulan soru.
CenterEntity, IAggregateRootMerkez/şube lokasyonu.
SiteSettingsEntity, IAggregateRootSite geneli ayarlar (tekil).
DistrictEntityBase<int>, IAggregateRootİlçe — sabit reference data (seed).
District, Guid yerine int kimlik kullanan tek aggregate’tir (EntityBase<int>). Sabit reference data olduğu için audit alanları boş kalır.

Sonraki adımlar

SharedKernel

EntityBase, ValueObject, Enumeration, DomainEvent ve guard altyapısı.

Aggregate'ler

User aggregate’i derinlemesine + tüm aggregate’lerin özeti.

Value Object'ler

Değişmezlik, ctor validasyonu ve hazır VO kataloğu.

Domain Event'ler

Olay yayma, MediatR dispatch ve domain vs integration event ayrımı.