Skip to main content
Value object (VO), kimliği olmayan, yalnızca taşıdığı değere göre eşitlenen ve oluşturulduktan sonra değişmeyen (immutable) bir nesnedir. İki 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:
  1. Geçersiz durumu temsil edilemez kılar. Email nesnesi varsa, o e-posta zaten regex’ten geçmiştir. Aggregate içinde tekrar doğrulamaya gerek yoktur.
  2. Anlam taşır. string phone yerine Phone; ham veri değil, kuralları kendi içinde taşıyan bir kavram.

Tasarım: değişmezlik + ctor validasyonu

Tüm VO’lar ValueObject tabanından türer ve şu deseni izler:
  • Doğrulama constructor’da (veya statik fabrika metodunda) yapılır; ihlalde DomainException fı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 protected parametresiz ctor bulunur.
FullName bilinçli olarak adı ad/soyad diye bölmez — kültürler arası isim yapıları (çoklu soyad, mononim, patronimik) farklıdır. Tek bir normalize edilmiş değer tutulur.
Bazı VO’lar 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:

Telefon — NetGSM formatı

Refresh token — düz değer asla saklanmaz

RefreshTokenInfo düz token’ı hiçbir zaman saklamaz; yalnızca SHA256 hash’ini tutar. Doğrulama Matches(plain) ile hash karşılaştırması üzerinden yapılır. DB sızıntısında token’lar açığa çıkmaz.

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ümeler enum yerine Enumeration ile modellenir (bkz. SharedKernel). Kimlik doğrulama ve yetkilendirmede sık kullanılanlar:

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.