Email("a@b.com") örneği eşittir; çünkü onları ayıran bir kimlik yoktur — yalnızca değerleri vardır.
VO’lar domain modelinde iki kritik iş görür:
- Geçersiz durumu temsil edilemez kılar.
Emailnesnesi varsa, o e-posta zaten regex’ten geçmiştir. Aggregate içinde tekrar doğrulamaya gerek yoktur. - Anlam taşır.
string phoneyerinePhone; ham veri değil, kuralları kendi içinde taşıyan bir kavram.
Tasarım: değişmezlik + ctor validasyonu
Tüm VO’larValueObject tabanından türer ve şu deseni izler:
- Doğrulama constructor’da (veya statik fabrika metodunda) yapılır; ihlalde
DomainExceptionfırlatılır. - Alanlar
get-only’dir; nesne oluştuktan sonra değişmez. GetAtomicValues()eşitliğe katkıda bulunan alanları sıralar.- EF Core materializasyonu için
protectedparametresiz ctor bulunur.
public ctor yerine statik fabrika metodu kullanır (özellikle üretim/hash gibi yan etki içerenler):
VO kataloğu
SharedKernel/ValueObjects/ altındaki başlıca value object’ler:
| VO | Kural / Davranış |
|---|---|
FullName | 2–200 karakter, Unicode harf + . - ', whitespace ve FormC normalizasyonu. |
Email | RFC benzeri regex doğrulaması. |
Phone | MobilePhoneUtility ile doğrulama + formatlama. ToNetGsmFormat() NetGSM için ham GSM döndürür. |
OtpCode | 4 hane (1000–9999). Create(string) doğrular, Generate() rastgele üretir. |
RefreshTokenInfo | Düz token saklanmaz; SHA256 hash’i tutulur. Create(plain, expiresAt), Matches(plain). |
TotpConfigurationInfo | TOTP yapılandırması (immutable). Configure/Enable/Disable/MarkUsed; CanAccept(step) replay koruması. |
TotpSecret | Şifrelenmiş TOTP sırrı. Create(encrypted). |
TCKimlikNo | 11 hane + checksum algoritması. IsForeign() (99/98/97 ile başlayan). |
HES | HES kodu format doğrulaması. |
Age | Doğum tarihinden yaş/gün/ay/yıl hesaplar (IFormattable). |
GeoLocation | Enlem (-90..90) / boylam (-180..180) doğrulaması. |
Image | ImageMagick (Magick.NET) ile resize + watermark; byte[] saklar. |
File | Dosya içeriği + metadata VO’su. |
Telefon — NetGSM formatı
Refresh token — düz değer asla saklanmaz
EF Core ile eşleme — kısaca
Value object’ler ayrı tablo değil, sahibi olan entity’nin kolonlarına açılır. EF Core’da bu,HasConversion (tek değerli VO için) veya ComplexProperty/OwnsOne (çok alanlı VO için) ile yapılır:
Eşleme detayları (hangi VO
HasConversion, hangisi owned type olarak çıkarılıyor) Veri Katmanı dokümanındadır. Domain tarafı persistence’tan habersizdir — VO’lar EF Core’a göre değil, iş kuralına göre tasarlanır.Enumeration örnekleri
Sabit kümelerenum yerine Enumeration ile modellenir (bkz. SharedKernel). Kimlik doğrulama ve yetkilendirmede sık kullanılanlar:
| Enumeration | Değerler |
|---|---|
OtpType | Sms=1, Email=2, Authenticator=3 |
AuthProviderType | Google=1, Meta=2, Apple=3, Keycloak=4 |
Role | SuperAdmin=1, Admin=2, Staff=3, ReadOnly=4 |
UserStatus | Draft=0, Active=1, Suspended=2, Banned=3, Pending=4 |
Sonraki adımlar
Aggregate'ler
VO’ların
User ve diğer aggregate’lerde kullanımı.SharedKernel
ValueObject ve Enumeration taban sınıfları.Veri Katmanı
VO → kolon eşlemesi ve
HasConversion detayları.Domain Event'ler
VO’ları payload olarak taşıyan event’ler.