मैं वर्तमान में ये एक ही चुनौतियों में से कुछ के माध्यम से काम कर रहा हूँ। मैं वास्तव में आपके आधार ValueObject<T>
कक्षा में एक आईडी जोड़ने का प्रशंसक नहीं हूं क्योंकि इससे सभी मूल्य वस्तुओं के लिए एक आईडी प्रदान की जाती है चाहे वे आवश्यक हों या नहीं, परिभाषा के आधार पर मूल्य वस्तु के रूप में कोई आईडी नहीं है, यह कुछ भी है जो मूल प्रकार को प्राप्त नहीं करेगा शुद्ध अर्थ में एक मूल्य वस्तु रहें।
आगे जाने से पहले, मैं ध्यान दूंगा कि कोडिंग डीडीडी में एक महत्वपूर्ण अवधारणा यह है कि आपको हर जगह शुद्ध डीडीडी नहीं होना चाहिए, बस इतना ही समय जब आप जानते हैं कि आपके बनाने और उनके व्यापार-बंदियां क्या हैं। ऐसा कहा जा रहा है कि, आपका दृष्टिकोण निश्चित रूप से ठीक माना जा सकता है, हालांकि मुझे विश्वास है कि यह एक रियायत जोड़ता है जो वास्तव में आवश्यक नहीं हो सकता है। मुख्य रूप से, यह आपके मूल्य वस्तुओं की समानता को प्रभावित करता है। आईडी के अतिरिक्त, दो टैग, एक ही नाम के साथ भी अब बराबर नहीं हैं।
यहां इस स्थिति के लिए मेरे दृष्टिकोण हैं: सबसे पहले आसान, वास्तव में जो भी मुझे लगता है उस पर लागू नहीं है, लेकिन यह महत्वपूर्ण है। यह मार्टिन के उत्तर के पहले भाग में एकल मूल्य वस्तु है।
- मूल्य वस्तु को एक इकाई की संपत्ति बनाएं।
जब तक आपकी मूल्य वस्तु में केवल साधारण प्रकार के गुण होते हैं, तो इकाई फ्रेमवर्क इसे ठीक से मानचित्रित करेगा।
उदाहरण के लिए:
public class BlogEntry : Entity<Guid>
{
public String Text { get; private set; }
public Tag Tag { get; private set; }
// Constructors, Factories, Methods, etc
}
इकाई की रूपरेखा कि ठीक संभाल लेंगे, क्या आप के साथ खत्म हो जाएगा एक एकल तालिका ब्लॉग प्रविष्टी कि बस के होते है:
अब मुझे लगता है कि वास्तव में इस मामले में आपका क्या नहीं है, लेकिन कई मूल्य वस्तुओं के लिए यह बहुत अच्छा काम करता है। एक बार मैं अक्सर डेट्रेंज मान ऑब्जेक्ट का उपयोग करता हूं जिसमें कई गुण होते हैं। फिर मेरे डोमेन ऑब्जेक्ट्स पर मेरे पास टाइप डेटेंज की एक संपत्ति है। ईएफ डोमेन ऑब्जेक्ट के लिए टेबल पर उनको मानचित्र करता है।
मैं इसे लाता हूं क्योंकि हमने ValueObject<T>
आधार प्रकार में आईडी जोड़ने के रियायत पर वापस जाने के बावजूद, यह आईडी आपके डोमेन ऑब्जेक्ट कंक्रीट कार्यान्वयन में सूचीबद्ध नहीं हो सकता है, फिर भी यह अभी भी है और अभी भी उठाया जाएगा एंटिटी फ्रेमवर्क द्वारा, इसके लिए, शायद सबसे आम मूल्य वस्तु उपयोग केस अब अच्छी तरह से काम नहीं कर रहा है।
ठीक है, अंत में, आपके विशिष्ट मामले (जिसे मैंने भी कुछ बार चलाया है) पर ठीक है। यहां बताया गया है कि मैंने इकाई ऑब्जेक्ट्स की सूची रखने के लिए किसी इकाई की आवश्यकता को संभालने का विकल्प चुना है। असल में यह डोमेन की हमारी समझ को विस्तारित करने के लिए उबलता है। टैग मूल्य ऑब्जेक्ट को मानना एक टैग पोस्ट में टैग की रिकॉर्डिंग के लिए है, जिस तरह से मैं इसे देखता हूं वह है कि एक ब्लॉग पोस्ट में टैग के मूल्य के साथ पोस्टटैग की एक सूची होती है। हां यह एक और कक्षा है, लेकिन आपको इसे प्रत्येक मूल्य वस्तु के लिए जोड़ने की आवश्यकता नहीं है, केवल तभी जरूरी है जब आपके पास मूल्य वस्तुओं की सूची हो, और मुझे लगता है कि क्या हो रहा है यह बेहतर ढंग से व्यक्त करता है।
तो यहाँ
(ऊपर टैग के अपने मूल्य वस्तु का प्रयोग करके) एक इकाई के लिए एक मूल्य वस्तु की एक सूची जोड़ने का एक उदाहरण है:
public class BlogEntry : Entity<Guid>
{
public String Text { get; private set; }
public ICollection<PostTag> PostTags { get; private set; }
// Constructors:
private BlogEntry(Guid id) : base(id) { }
protected BlogEntry() : this(Guid.NewGuid()) { }
// Factories:
public static BlogEntry Create (String text, ICollection<PostTag> tags = null)
{
if(tags == null) { tags = new List<PostTag>(); }
return new BlogEntry(){ Text = text, Tags = tags };
}
// Methods:
public void AddTag(String name)
{
PostTags.Add(PostTag.Create(name));
}
}
public class PostTag : Entity<Guid>
{
// Properties:
public Tag Tag { get; private set; }
public DateTime DateAdded { get; private set; } // Properties that aren't relevant to the value of Tag.
// Constructors:
private PostTag(Guid id) : base(id) { }
protected PostTag() : this(Guid.NewGuid()) { }
// Factories:
public static PostTag Create(Tag tag)
{
return new PostTag(){ Tag = tag, DateAdded = DateTime.Now };
}
public static PostTag Create(Tag tag, DateTime dateAdded)
{
return new PostTag(){ Tag = tag, DateAdded = dateAdded };
}
}
कि आपके ब्लॉग प्रविष्टी मूल्य की वस्तुओं से समझौता किए बिना एकाधिक टैग को शामिल करने की अनुमति देगा और इकाई फ्रेमवर्क कुछ भी विशेष करने की आवश्यकता के बिना इसे ठीक कर देगा।
आप क्लास का उत्तराधिकारी हो सकते हैं और व्युत्पन्न कक्षा –
पर मुख्य संपत्ति जोड़ सकते हैं, मैंने सोचा था, लेकिन मैं अभी भी 2 वर्ग प्रति मान ऑब्जेक्ट के साथ समाप्त कर दूंगा। –