2011-09-03 14 views
15

Bu anda DDD hakkında benim anlayış:Karmaşık sorguların depo modelini atlamak doğru mudur?

  • sıkı depo deseni yalnızca uygulamalıdır olsun(), (silme) ve) (oluşturabilir ve belki bir arama veya yapabilirsiniz get() ait varyantları bütün bir koleksiyon
  • her agrega kök

    burada soru nasıl implemen etmektir

(araştırmadan, ben bu evrensel normları kabul edilmez biliyorum) bir depo sahip olması yaygındır almak t Birçok agrega kökünü içeren karmaşık sorgular. Örneğin, ürün ve kullanıcı olmak üzere iki toplam kökümüz var. Bir kullanıcının hangi ürünleri satın aldığını listeleyen bir sayfa yapıyorsam, o zaman hem kullanıcı toplamı hem de ürün toplamı boyunca uzanan bir sorgum var.

Bu sorgu nasıl uygulanmalıdır?

  1. Şimdi ne yapıyorum ilgili işlevselliği ile bu sorgu ve sorgular için bir depo (bazı katılmıyorum ve depo sorgu tabakası değil diyecekler) olması aslında. Ürün ve kullanıcı için yalnızca depo

  2. Kullanımı (bu yanlış geliyor) tüm kayıtları kapmak ve bellekte her şeyi

  3. sorgu var (LINQ veya SQL) depoyu kullanarak değil, hizmet içinde olmak Agregalar ile ilişkili.

Başka yollar var mı?

cevap

13

sıkı depo desen sadece)() ( silmek ve oluşturmak, get() uygulamak ve belki bir arama veya bir koleksiyonun tamamını alabilirsiniz get() ait varyantları gerektiğini

Havuz arayüzü, alan adınızın bir parçasıdır ve mümkün olduğunca Ubiquitous Language'a dayanmalıdır. Tüm Depolar, tüm Agregalarınızın farklı olduğu gibi farklıdır. Sıkı, generic repositories CRUD aşırı genleşmesidir ve kod açıklığını azaltabilir. 'Yaratma' yöntemi ayrıca Depoya ait değildir, çünkü nesne yaşam döngüsünün başlangıcı genellikle Fabrika veya Nesnenin kendisi tarafından ele alınır. 'Ekle' varolan nesneyi sürdürmek istediğinizde daha iyi bir isim gibi görünüyor çünkü Deposu bir koleksiyon semantiği içeriyor.

Buradaki soru, birçok toplu kökün içerdiği karmaşık sorguların nasıl uygulanacağıdır. Örneğin, iki tane toplam kökümüz var - ürün ve kullanıcı.Bir sayfa yapıyorum o zaman ben kullanıcı agrega ve ürün agrega ikisinde birden germek bir sorgu var, ürünler kullanıcı ne satın almış hangi listeyle.

Bu durumda sadece iş gereksinimlerini dinlemelisiniz, bence en önemli olduğunu düşündüğüm bölümü vurguladım. Eğer ihtiyaç benziyor Buna dayanarak:

Products products = /* get Products repository implementation */; 
IList<Product> res = products.BoughtByUser(User user); 

o iş gereksinimleri ve mümkün olduğunca her yerde diliyle eşleşecek şekilde olduğu gibi kod düzenleme fikri. Depo arayüzlerinin isimlendirilmesi de önemlidir, Ürünleri veya Tüm Ürünler yerine ProductsRepository. Phil Calçado'nun bu konuda bir very good article, şiddetle tavsiye edilir.

How should this query be implemented? 

bu sorgu hakkında özel bir şey yok, sadece ürünler deposundaki tüm diğer sorgular gibi uygulanabilir. Sorgulama, Etki Alanı'ndan uygulama Veri Erişimi katmanına ait olduğu için Etki Alanından gizlenmiştir. Veri Erişimi, tüm Toplamalar ve onların ilişkileri hakkında samimi bilgiye sahip olduğu için herhangi bir sorguyu uygulayabilir. Bu noktada sadece bir Hazırda Beklet veya SQL sorusu olurdu. Her şeyden

+1

Downvoter Yorum yapmak için dikkat edilmeli? – Dmitry

+0

Szymon'un cevabını daha çok sevdim - sorguların alan/repo katmanından ayrıştırılması gereken noktada çok kolaydı. – drogon

+8

Yanıt yararlı olmadığında reddediyorsunuz. Benimki faydalı değil miydi? – Dmitry

-5

Sadece bir depo sınıfına koyun. Ürün Geri Dönüşünde, muhtemelen geri döndüğü gibi bir Get'dir. GetProductsByUser (int Kullanıcı Kimliği). Ya da n-Tier mimariniz varsa, servis yönteminde olabilir.

Her zaman veritabanını her şeyden ayrı olduğu için veri tabanı erişim yöntemlerini yerleştirecek bir yer olarak depoyu her zaman düşündüm.

10

Birincisi, sorgular nadiren Agrega Roots karşı yapılır. Verilere karşı yapılır ve sadece veriyi döndürürler. Havuzlar, uygulama katmanında (komutlar ve benzeri) kod kullanımında kalıcılık için çok kullanışlı soyutlamalardır. Onlara ihtiyacımız var çünkü bir veritabanına ihtiyaç duymadan bu katmanı test edebilmek istiyoruz. Bu yüzden depo ne kadar küçük olursa o kadar iyidir - alay etmek daha kolaydır.

benim UI veri deposunu sorgulamak için izin uzman Bulucu nesneleri kullanma eğilimindedir. Finder'ları UI katmanına bile yerleştiriyorum. Şey, her UI değiştiğinde değişmeye eğilimlidir, bu yüzden onları bir araya getirmek daha iyidir. Havuzda sorgulama yöntemlerini kullanmak istememenizin bir başka iyi nedeni de, deponun alanınızın bir parçası, her yerde bulunan dilinizdir. Onları kısa yaşamaya ve hızla değişmeye eğilimli UI konseptleriyle kirletmek istemezsiniz.

Bir süre önce bu kavramı açıklayan bir blog yazısı yazdım. here'u bulabilirsiniz.

+1

1 archive.org için bağlantıyı ekledi. Neden bir şeyleri zorlaştırır - etki alanı modeli, kullanıcı arabirimi gereksinimlerine değil, iş alanına uyarlanmalıdır. – kstaruch