2015-05-23 3 views
15

मैं अपने डोमेन मॉडल को प्रदूषित किए बिना इकाई फ्रेमवर्क में मूल्य वस्तुओं को कैसे जारी रखूं? एफई (अच्छी तरह से, सामान्य रूप में रिलेशनल DBS) मुझे एक कुंजी निर्धारित करने की आवश्यकता होती है - दूसरी ओर उदाहरणइकाई फ्रेमवर्क में मूल्य वस्तुओं से कैसे निपटें?

public class Tag : ValueObject<Tag> 
{ 
    private readonly string name; 

    public Tag(string name) 
    { 
     this.name = name; 
    } 

    public string Name { get { return this.name; }} 
} 

के लिए है, जो मेरी मूल्य वस्तुओं बॉक्स से बाहर नहीं है, मैं दृढ़ता चिंताओं को दूर नहीं करना चाहिए मॉडल में क्या मुझे वास्तव में एक और कक्षा बनाना है जिसमें मूल्य वस्तु से सभी फ़ील्ड और एक प्रमुख संपत्ति शामिल है और फिर उन्हें एक दूसरे के लिए मानचित्र बनाएं? मै शायद नहीं।

क्या शायद एक और अधिक सुरुचिपूर्ण समाधान है?

+2

आप क्लास का उत्तराधिकारी हो सकते हैं और व्युत्पन्न कक्षा –

+0

पर मुख्य संपत्ति जोड़ सकते हैं, मैंने सोचा था, लेकिन मैं अभी भी 2 वर्ग प्रति मान ऑब्जेक्ट के साथ समाप्त कर दूंगा। –

उत्तर

9

वॉन वेरनॉन अपनी उत्कृष्ट पुस्तक Implementing Domain-Driven Design में मूल्यवान मूल्य वस्तुओं (पृष्ठ 248) के बारे में लिखते हैं।

ORM और एकल मूल्य ऑब्जेक्ट्स

मूल विचार पंक्ति जहां अपनी मूल इकाई संग्रहीत किया जाता है की अलग-अलग कॉलम में मूल्य की विशेषताओं में से प्रत्येक स्टोर करने के लिए है। एक और तरीके से कहा, एक एकल मूल्य वस्तु अपने मूल इकाई की पंक्ति में denormalized है। कॉलम नामकरण के लिए स्पष्ट रूप से पहचान करने के लिए सम्मेलन को नियोजित करने के फायदे हैं और धारावाहिक वस्तुओं के नाम के तरीके को मानकीकृत करते हैं।

ORM और कई मूल्यों एक डाटाबेस इकाई के समर्थन से

मूल्य उदाहरणों का एक संग्रह बने एक ORM और एक संबंधपरक डेटाबेस का उपयोग करके एक इकाई के रूप में मूल्य प्रकार के इलाज के लिए करने के लिए एक बहुत ही स्पष्ट दृष्टिकोण डेटा मॉडल में। (...) इसे पूरा करने के लिए हम Layer Supertype पर नियोजित कर सकते हैं।

नमूना घिरा सी # में संदर्भों यहां पाया जा सकता: https://github.com/VaughnVernon/IDDD_Samples_NET

+1

हाँ, यही वह है जो मैंने कर दिया। ValueObject में अब एक पूर्णांक कुंजी है और इसलिए सभी व्युत्पन्न मूल्य वस्तुएं हैं। यह 2 एन कक्षाओं के बजाय एन + 1 कक्षाओं की राशि होगी। ValueObject कक्षा साझा कर्नेल का हिस्सा है, इसलिए यह सीधे मॉडल से संबंधित नहीं है। –

+1

जब तक 1-एन (या कई से कई) से निपटने तक, इकाई ढांचे जटिल प्रकार का उपयोग करें। – Marco

4

मैं वर्तमान में ये एक ही चुनौतियों में से कुछ के माध्यम से काम कर रहा हूँ। मैं वास्तव में आपके आधार 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 }; 
     } 
    } 

कि आपके ब्लॉग प्रविष्टी मूल्य की वस्तुओं से समझौता किए बिना एकाधिक टैग को शामिल करने की अनुमति देगा और इकाई फ्रेमवर्क कुछ भी विशेष करने की आवश्यकता के बिना इसे ठीक कर देगा।

+0

इस तरह की चीज के साथ हाल ही में एक और तकनीक का आनंद ले रहा है जो जेसन स्ट्रिंग के रूप में मूल्य वस्तुओं का संग्रह संग्रहीत कर रहा है। संग्रह वाली आपकी इकाई ऑब्जेक्ट एक स्ट्रिंग के अंदर और बाहर पार्सिंग को संभाल सकती है ताकि आपका शेष मॉडल अभी भी संग्रह के रूप में इसके साथ काम कर सके लेकिन भंडारण के लिए यह एक साधारण स्ट्रिंग के रूप में चला जाता है। एसक्यूएल सर्वर जेसन डेटा के साथ भी काम कर सकता है अगर आपको मैन्युअल क्वेरी की ज़रूरत है, हालांकि यह थोड़ा और काम है। बोनस के रूप में यदि आपके विचार अजाक्स/Jquery का उपयोग कर रहे हैं तो आप बस जेसनस्ट्रिंग प्रॉपर्टी का उपयोग कर सकते हैं। –

संबंधित मुद्दे