Etki Alanlarına Dayalı Tasarım (DDD) kavramlarına daldım ve özellikle etki alanı ve kalıcılık modelinin izolasyonu ile ilgili bazı ilkeleri garip buldum. İşte temel anlayışım:
- Uygulama katmanındaki bir hizmet (özellik kümesi sağlar), etki alanı nesnelerini işlevini yerine getirmesi gereken bir havuzdan ister.
- Bu deponun somut uygulaması, uygulandığı depolama alanından veri getirir
- Hizmet, iş mantığını kapsülleyen etki alanı nesnesine durumunu değiştiren belirli görevleri gerçekleştirmesini bildirir.
- Hizmet, depoya değiştirilen etki alanı nesnesini sürdürmesini bildirir.
- Havuzun, etki alanı nesnesini depolamadaki karşılık gelen gösterime eşlemesi gerekir.
Şimdi, yukarıdaki varsayımlar göz önüne alındığında, aşağıdakiler garip görünüyor:
İlan 2 .:
Etki alanı modeli, istenen işlev için gerekli olmasalar bile tüm etki alanı nesnesini (tüm alanlar ve başvurular dahil) yüklüyor gibi görünüyor. Bu etki alanı nesnelerini ve başvurdukları tüm nesneleri sırayla yüklemediğiniz sürece, diğer etki alanı nesnelerine başvuruda bulunulursa, yükleme işlemi tamamen mümkün olmayabilir. Tembel yükleme akla geliyor, ancak öncelikle deponun sorumluluğu olması gereken etki alanı nesnelerinizi sorgulamaya başladığınız anlamına gelir.
Bu sorun göz önüne alındığında, etki alanı nesnelerini yüklemenin "doğru" yolu, her kullanım durumu için özel bir yükleme işlevine sahip gibi görünmektedir. Bu özel işlevler daha sonra yalnızca tasarlandıkları kullanım durumunun gerektirdiği verileri yükler. Garipliğin devreye girdiği yer şudur: Birincisi, deponun her uygulaması için hatırı sayılır miktarda yükleme işlevi sürdürmek zorunda kalacaktım ve etki alanı nesneleri null
, alanlarını taşıyan eksik devletlerle sonuçlanacaktı . İkincisi teknik olarak bir sorun olmamalıdır, çünkü bir değer yüklenmemişse, onu yine de talep eden işlevsellik gerektirmez. Hala garip ve potansiyel bir tehlike.
İlan 3 .:
Bir etki alanı nesnesi, depo hakkında herhangi bir fikri yoksa, yapı üzerindeki benzersizlik kısıtlamalarını nasıl doğrular? Örneğin, User
benzersiz bir sosyal güvenlik numarasıyla (verilen) yeni bir tane oluşturmak istersem , en erken çakışma depodan yalnızca veritabanında tanımlanan bir benzersizlik kısıtlaması varsa nesneyi kaydetmesini istemekle ortaya çıkar. Aksi takdirde, User
yeni bir güvenlik oluşturmadan önce verilen sosyal güvenlikle ilgili bir şey arayabilir ve bir hata rapor edebilirim. Ancak daha sonra kısıtlama denetimleri ait oldukları etki alanı nesnesinde değil, hizmette yaşayacaktır. Ben sadece etki alanı nesneleri doğrulama için (enjekte) depoları kullanmak için çok iyi izin olduğunu fark ettim.
İlan 5 .:
Etki alanı nesnelerinin bir depolama arka ucuna eşlenmesini, etki alanı nesnelerinin altta yatan verileri doğrudan değiştirmesine kıyasla, yoğun çalışma gerektiren bir işlem olarak algılarım. Elbette, beton depolama uygulamasını etki alanı kodundan ayırmak için temel bir ön koşuldur. Ancak, bu kadar yüksek bir maliyetle mi geliyor?
Görünüşe göre sizin için eşleme yapmak için ORM araçlarını kullanma seçeneğiniz var. Bunlar genellikle etki alanı modelini ORM'nin kısıtlamalarına göre tasarlamanızı veya hatta etki alanından altyapı katmanına (örneğin etki alanı nesnelerinde ORM ek açıklamalarını kullanarak) bir bağımlılık getirmenizi gerektirir. Ayrıca ORM'lerin hatırı sayılır bir hesaplama yükü sunduğunu okudum.
ORS benzeri kavramların neredeyse hiç bulunmadığı NoSQL veritabanlarında, etki alanı modellerinde hangi özelliklerin değiştiğini nasıl takip edersiniz save()
?
Düzenleme : Ayrıca, bir havuzun etki alanı nesnesinin durumuna (yani her alanın değeri) erişmesi için, etki alanı nesnesinin kapsüllemeyi kesen iç durumunu göstermesi gerekir.
Genel olarak:
- İşlemsel mantık nereye gider? Bu kesinlikle kalıcılığa özgüdür. Bazı depolama altyapısı işlemleri (hatta bellek içi sahte depolar gibi) desteklemeyebilir.
- Birden çok nesneyi değiştiren toplu işlemler için, nesnenin kapsüllenmiş doğrulama mantığından geçmek için her nesneyi tek tek yüklemem, değiştirmem ve depolamam gerekir mi? Bu, doğrudan veritabanına tek bir sorgu yürütmeye karşıdır.
Bu konuyla ilgili bazı açıklamaları takdir ediyorum. Varsayımlarım doğru mu? Değilse, bu sorunlarla başa çıkmanın doğru yolu nedir?