DDD - Toplayıcı kök depoları toplayıcıları kurtarıyor mu?


27

Mevcut bir uygulamanın greenfield modülü için DDD benzeri bir yaklaşım kullanıyorum; mimari nedeniyle% 100 DDD değil, ancak bazı DDD konseptlerini kullanmaya çalışıyorum. Ben sınırlı bir bağlam (O uygun terim olduğunu düşünüyorum - Hala DDD hakkında öğreniyorum) sahip iki varlıkları oluşan: Conversationve Message. Konuşma, bir ileti dizisi konuşma olmadan mevcut olmadığından ve sistemdeki tüm iletiler ileti dizisinin bir parçası olduğu için köküdür.

ConversationRepositoryVeritabanında Konuşmaları bulan bir sınıfım var (gerçekte bir Ağ Geçidi gibi olmasına rağmen, "Depo" terimini kullanıyorum); Bir Konuşma bulduğunda, ayrıca (Fabrikalar aracılığıyla) o Konuşma için bir mesaj listesi (bir özellik olarak açıktır) oluşturur. Bu, olayları ele almanın doğru yolu gibi görünüyor MessageRepository; çünkü yalnızca bir Konuşma alındığında olduğu gibi , tam gelişmiş bir sınıfa ihtiyaç duyulmuyor gibi görünüyor.

Ancak, bir Mesajın kaydedilmesi söz konusu olduğunda, bu, Mesajın toplam kökü olduğu için, Konuşma Raporunun sorumluluğunda mıdır? Demek istediğim, ConversationRepository'de, AddMessageparametre olarak bir Mesaj alan ve veritabanına kaydeden bir yöntemim olmalı mı? Yoksa Mesajları bulmak / kaydetmek için ayrı bir havuza mı ihtiyacım var? Mantıksal şey, Varlık başına bir depo gibi gözüküyor, ama aynı zamanda "Bağlam başına bir depo" da duydum.

Yanıtlar:


25

Mavi kitap değerinde DDD yaklaşımın en iyi out almak istiyorsanız okumak kesinlikle. DDD kalıpları önemsiz değildir ve her birinin özünü öğrenmek, hangi kalıpları ne zaman kullanacağınızı, uygulamanızı katmanlara nasıl ayıracağınızı, Topaklarınızı nasıl tanımlayacağınızı vb.

Bahsettiğiniz 2 varlık grubu Sınırlı Bağlam değil - muhtemelen bir Toplamadır. Her Topluluğun, diğer tüm nesneler için Topluluğa tek bir giriş noktası görevi gören bir Varlık olan bir Toplama Kökü vardır. Bu nedenle, bir Varlık ile başka bir Toplamada, Toplama Kökü olmayan bir Varlık arasında doğrudan bir ilişki yoktur.

Diğer nesnelerin geçmesiyle kolayca elde edilemeyen Varlıkları ele geçirmek için depolara ihtiyaç vardır. Havuzlar genellikle Toplu Kökler içerir, ancak normal Varlıkların Depoları da olabilir.

Örneğinizde, Konuşma Toplam Kök gibi görünüyor. Belki Konuşmalar, uygulamanızın başlangıç ​​noktasıdır veya belki de ayrıntılı kriterler ile sorgulamak istiyorsunuz, bu nedenle diğer nesnelerin basit bir şekilde gezinmesiyle tatmin edici bir şekilde erişilebilir değiller. Böyle bir durumda, müşteriye, doğrudan sorgulamak, eklemek veya silmek için bir dizi hafıza içi Konuşma yanılsaması verecek olan bir Depo oluşturabilirsiniz. Öte yandan, bir Sohbetin geçişi yoluyla iletiler kolayca elde edilir ve bunları bir görüşmenin yalnızca bir keresinde bir Konuşmanın İletilerinin tamamı gibi ayrıntılı kriterlere göre almak istemeyebilirsiniz, bu nedenle bir Depoya ihtiyaç duymayabilirler.

ConversationRepository, Mesajların devam etmesinde rol oynayacaktır, ancak sizin de belirttiğiniz gibi doğrudan bir rol oynayamayacaktır. Bu nedenle, ConversationRepository'de hiçbir AddMessage () yok (bu yöntem daha çok Conversation'a aittir), bunun yerine, Repository bir Conversation'ı sürdürdüğünde, aynı zamanda, bir ORM çerçevesi kullanıyorsanız, Transpard'ı aynı anda sürdürmek iyi bir fikirdir. (N) Hazırda Bekletme, eğer isterseniz geçici SQL kullanarak vb.


1
Konuşma gibi bir toplu kökün içinde Mesaj, Şanslılar ve Kanatlılar gibi birçok farklı varlık türü varsa, bir konuşmayı kaydettiğinizde, örneğin, ConversationRepo.save (konuşma), içinde hangi varlıklara ihtiyaç duyduğunu nasıl bildiniz? kurtarılmak için Yukarıdaki poster örneğinde, yalnızca mesaj varlıklarının kaydedilmesi gerekir. Kimlikleri olmayan varlıkları bulmak için toplam kök içindeki olası tüm koleksiyonları geçiyor musunuz?
chris-richards

3

ConversationService'i oluşturabilir ve IConversationRepository ve IMessageRepository'yi yapıcısına enjekte edebilirsiniz . Basit CRUD işlemleri için havuzlar ve diğer her şey için servisler kullanın (önbellekleme, mantık tasarrufu vb.)


1
mantık CRUD kaydetmiyor?
Timothy Groote
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.