2009-10-19 22 views
7

Sadece veri kapları olan nesnelerin yazılmasını önlemek için bazı önerilerde bulunmak istiyorum. nasıl agrega kökleri çalışmalarını yöneten pinciples VerilenDDD - Toplu Kökler ve Davranışsal Nesneler Oluşturma

public class Post : IAggregateRoot 
{ 
    List<Comment> Comments {get; set;} 
} 

, böyle yukarıdaki kodu çağıracak geçerlidir:

aşağıdaki Agrega Root düşünün?

new Post().Comments.Add(New Comment("stuff")); 

Yoksa bu doğru mu? Böyle

public class Post : IAggregateRoot 
{ 
     List<Comment> Comments {get; private set;} 
     public void AddComment(string message) 
     { 
     Comments.Add(new Comment(message)); 
     } 
} 

Ve seslendi:

new Post().AddComment("stuff"); 

bu mu Eric Evan Agrega Kökler atomik kalarak ne anlama geldiğini?

Böyle bir durum söz konusu olduğunda, bu varlıklar herhangi bir genel belirleyici içermiyor, bunun yerine destekleyici yöntemlere (AddThis, RemoveThat) sahip olmak anlamına mı geliyor? Zengin davranışa sahip nesneler nasıl yaratıyorsunuz?

+0

Nihayet geri kendisi dönerek bu yöntemle zincirleme yöntemi yapabilir 'Post' ve 'Comments' kümelerini bir araya getirmek için geçerli bir nedeniniz olmadıkça ikisi de yanlıştır. Büyük kümelenme kümenizle birlikte hangi ticari geliştiricileri korumaya çalışıyorsunuz? Eğer değilse, 'Yorum' kendi toplam kökünü oluşturmalıdır. – plalx

cevap

5

Toplam kök kavramı kavramınız doğru, ancak iki seçeneğiniz gerçekten uygulama hakkındadır - ve her ikisi de geçerlidir.

Seçenek 1

  • Artıları: Sizin varlık arayüzü oldukça temiz kalır.

  • Dezavantajları: Add yöntem tel kadar Post ve Comment arasındaki ilişki için mantığına ihtiyacı yoktur ( NHibernate düşünün). güçlü bir şekilde yazılan koleksiyon ve , Add yöntemini geçersiz kılabilir veya olaylarını ile arasındaki bağlantıya geri getirebilirsiniz.

Seçenek 2

  • Avantaj: Add/Remove yöntem kablo mantığı için elverişli bir yer sağlar.

  • Eksiler: Toplama özelliklerinin sayısı arttıkça, Add/Remove yönteminde bir patlama olabilir. Ayrıca, açıkta kalan koleksiyonlar, Comments'un her zaman özel yöntemler kullanılarak eklendiğinden/kaldırıldığından emin olmak için ReadOnly olmalıdır.

Tercihim Seçenek 1'dir - Olayları toplayan genel koleksiyonları kullanıyorum. IMHO, daha doğal hissettiriyor ve diğer geliştiricilerin kodlamasını kolaylaştırıyor. SO üzerindeki diğerleri aksini belirtmiş olsa da. yaklaşık davranışı konuşmak

, biz idareye mantığı takılarak bahsediyoruz. Örneğin.Comments'un 5 gün sonra eklenmesini durdurmak isterseniz, Comment eklendiğinde Post sorusunu sorarsınız ve Post denetimi yapmak için mantığı içerir.

3

İkinci seçenek ile giderdim.

İlk olarak koleksiyonları IEnumerable olarak göstermeyi seviyorum. Böylece bu listeyi çok kolay manipüle etmek ve istenmeyen davranışlara karşı korunmak mümkün değildir. Düzenli olarak, nesne listede varsa veya bulunmuyorsa, ekleme ve çıkarma yöntemini kontrol ediyorum.

İkincil olarak kapsüllenmiş ve sonradan bir mantık ekleyebilirim. AddX yöntemi çok etmektir

var post = new Post() 
    .AddComment("My First comment") 
    .AddComment("My Second comment") 
    .Publish(); 

Eğer bu mümkün aşırı ile yapmak, varlığınızı şişkinlik:

var post = new Post() 
    .Add(new Comment("My First comment")) 
    .Add(new Comment("My Second comment")) 
    .Publish();