2009-10-19 11 views
7

मैं कुछ वस्तुओं के बारे में पूछना चाहता हूं कि केवल उन वस्तुओं को लिखने से बचें जो डेटा कंटेनर हैं।डीडीडी - कुल रूट्स और व्यवहार संबंधी ऑब्जेक्ट्स बनाना

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

pinciples तरीका नियंत्रित कुल जड़ों काम को देखते हुए यह इस तरह से ऊपर कोड कॉल करने के लिए मान्य है:

निम्नलिखित सकल रूट पर विचार करें?

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

या यह सही तरीका है?

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

और इस तरह कहा जाता है:

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

इस है एरिक इवान सकल जड़ें परमाणु द्वारा किया जा रहा है इसका मतलब क्या है?

यदि ऐसा है, तो इसका मतलब यह है कि संस्थाओं के पास कोई सार्वजनिक सेटर्स नहीं है, बल्कि इसके बजाय विधियों (AddThis, RemoveThat) का समर्थन कर रहे हैं? क्या आप अमीर व्यवहार के साथ वस्तुओं को बनाते हैं?

+0

अंत में आप वापस ही वापस लौट कर कि विधि के साथ चेनिंग विधि बना सकते हैं दोनों संभवतः गलत हैं जब तक कि आपके पास 'पोस्ट' और' टिप्पणियां 'क्लस्टर करने का वैध कारण न हो। आप अपने बड़े क्लस्टर के साथ कुल व्यापारिक आविष्कारों की रक्षा करने की कोशिश कर रहे हैं? यदि वहां नहीं है तो 'टिप्पणी' यह स्वयं की कुल रूट होनी चाहिए। – plalx

उत्तर

5

आपको कुल जड़ों की अवधारणा सही है, लेकिन आपके दो विकल्प वास्तव में कार्यान्वयन के बारे में हैं - और दोनों मान्य हैं।

विकल्प 1

  • पेशेवरों: अपनी इकाई इंटरफ़ेस काफी साफ रहता है।

  • विपक्ष: Add विधि तार ऊपर Post और Comment के बीच के रिश्ते को तर्क की जरूरत है (लगता है NHibernate)। आप दृढ़ता से टाइप किए गए संग्रह और को जोड़ें विधि को ओवरराइड कर सकते हैं, या आप Post पर हैंडल पर ईवेंट को वापस बढ़ा सकते हैं।

विकल्प 2

  • सकारात्मक: Add/Remove तरीकों तारों तर्क के लिए एक सुविधाजनक जगह प्रदान करते हैं।

  • विपक्ष: संग्रह प्रॉपर्टी की संख्या विकसित होता है, आप Add/Remove तरीकों में से एक विस्फोट हो सकता है। इसके अलावा, खुला संग्रह केवल पढ़ने के लिए किया जाना चाहिए, यह सुनिश्चित करने के लिए कि Comments को विशेष तरीकों का उपयोग करके हमेशा जोड़ा/हटा दिया जाता है।

मेरी प्राथमिकता विकल्प 1 है - मैं सामान्य संग्रह है कि घटनाओं को बढ़ाने का उपयोग करें। आईएमएचओ, यह अधिक प्राकृतिक लगता है, और अन्य डेवलपर्स के खिलाफ कोड करना आसान है। हालांकि एसओ पर अन्य ने अन्यथा व्यक्त किया है।

जब हम के बारे में व्यवहार बात करते हैं, हम एंटिटी को तर्क संलग्न के बारे में बात कर रहे हैं। उदाहरण के लिए।यदि आप Comments को 5 दिनों के बाद जोड़ा जाना चाहते हैं, तो Post से पूछें तो Comment मान्य है, और Post में चेक करने के लिए तर्क होगा।

3

मैं दूसरे विकल्प के साथ जाऊंगा।

सबसे पहले मैं संग्रह को आईनेमरेबल के रूप में दिखाना पसंद करता हूं। इस तरह से उस सूची को इतनी आसानी से कुशल बनाना संभव नहीं है और यह अवांछित व्यवहार के खिलाफ सुरक्षित है। नियमित रूप से मैं विधि को जोड़ने और हटाने में जांच करता हूं कि यदि वस्तु सूची में है या नहीं।

दूसरा यह encapsulated और मैं बाद में कुछ तर्क जोड़ सकते हैं। AddX विधि ज्यादा है

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

यदि आपका इकाई सूजन है, तो यह संभव है कि यह अधिक भार के साथ क्या करना:

var post = new Post() 
    .Add(new Comment("My First comment")) 
    .Add(new Comment("My Second comment")) 
    .Publish(); 
संबंधित मुद्दे