2011-10-10 7 views
5

मैं इस पोस्ट के साथ कुछ चर्चा चाहता हूं।स्थिर वस्तु के लिए ExpandoObject और फिर से वापस। दो डोमेन स्पैनिंग

मैं एक विरासत प्रणाली में सी # 4.0 गतिशील सुविधाओं को शामिल करने के लिए देख रहा हूं। मेरा स्पष्ट उदाहरण डेटा परत में रोब कॉनरी के विशाल का उपयोग कर रहा है। लेकिन मेरे प्रश्न कहीं भी लागू होंगे, एक गतिशील वस्तु को मौजूदा, दृढ़ता से टाइप की गई व्यावसायिक वस्तु के साथ बातचीत करनी चाहिए ताकि गुणों के बीच मैपिंग हो।

मैं करने के लिए और अगले दो (सरलीकृत) तरीकों के साथ स्थिर (ठोस) वस्तुओं और expando वस्तुओं से रूपांतरण को स्वचालित कर सकते हैं:

public static object ToConcrete<T>(System.Dynamic.ExpandoObject dynObject) 
    { 
     object instance = Activator.CreateInstance<T>(); 
     var dict = dynObject as IDictionary<string, object>; 
     PropertyInfo[] targetProperties = instance.GetType().GetProperties(); 

     foreach (PropertyInfo property in targetProperties) 
     { 
      object propVal; 
      if (dict.TryGetValue(property.Name, out propVal)) 
      { 
       property.SetValue(instance, propVal, null); 
      } 
     } 

     return instance; 
    } 

    public static System.Dynamic.ExpandoObject ToExpando(object staticObject) 
    { 
     System.Dynamic.ExpandoObject expando = new ExpandoObject(); 
     var dict = expando as IDictionary<string, object>; 
     PropertyInfo[] properties = staticObject.GetType().GetProperties(); 

     foreach (PropertyInfo property in properties) 
     { 
      dict[property.Name] = property.GetValue(staticObject, null); 
     } 

     return expando; 
    } 

लेकिन अब मैं सवालों की एक संख्या है।

क्या विरासत प्रणाली में गतिशील और गैर-गतिशील होने का मेरा प्रयास मेरे हिस्से पर गलत धारणा का प्रतिनिधित्व करता है? मतलब, क्या मैं गतिशील के इरादे से काम कर रहा हूं? क्या मैं खुद को समस्याओं के लिए स्थापित कर रहा हूं?

क्या मुझे गतिशीलता का उपयोग उन घटकों तक सीमित होना चाहिए जो गतिशील वस्तुओं और स्थैतिक वस्तुओं के बीच कोई मैपिंग न हो? मतलब, क्या दो भाषा डोमेन मिश्रण करने का प्रयास करना बुरा व्यवहार है? क्या मैं खराब वास्तुकला बना रहा हूं? एक विरोधी पैटर्न?

भारी जैसे घटक के मामले में, अगर हम कहते हैं कि एक्सपोन्डोब्जेक्ट और दृढ़ता से टाइप की गई वस्तुओं के बीच मैप करना गलत अभ्यास है, तो मुझे अपनी विरासत प्रणाली में प्लग करने का कोई तरीका नहीं है क्योंकि यह व्यापार वस्तुओं को सतह में रखना चाहिए विरासत कोड और गतिशील वस्तुओं में एक बड़े, विरासत कोड बेस की वस्तुओं को दोबारा करने, या करना चाहिए, कोई व्यावहारिक तरीका नहीं है। शायद गतिशीलता को विरासत में वास्तविक रूप से जोड़ा नहीं जा सकता है। नेट कोड बेस। शायद इसे शुरुआत से ही शामिल किया जाना चाहिए, या बिल्कुल नहीं।

+0

आपको 'ExpandoObject' का उपयोग करने के लिए क्या प्रेरणा है? – svick

उत्तर

2

तो आप गतिशील वस्तुओं को स्थैतिक रूप से टाइप की गई वस्तुओं को मैप करना चाहते हैं ताकि उन्हें भारी में उपयोग किया जा सके। मुझे लगता है कि यह ठीक है, यह LINQ से SQL ऑब्जेक्ट्स के लिए व्यावसायिक ऑब्जेक्ट्स मैपिंग जैसा है ताकि आप उस ओआरएम के साथ काम कर सकें। हालांकि एक नकारात्मक बात यह है कि आप अपने डेटाबेस में और बाहर सब कुछ मैपिंग समाप्त कर देंगे। यह दर्द हो सकता है। LINQ से SQL के लिए यह मेरे लिए दर्द है।

इस बारे में सोचें कि यह कोड बदलने के लिए क्या होगा, और आप एक उपाय यह दृष्टिकोण कितना प्रभावी है। मेरे लिए, जब मैं एक व्यापार वस्तु के लिए एक संपत्ति जोड़ने की जरूरत है, मैं करने के लिए है:

  1. वस्तु
  2. के लिए प्रॉपर्टी जोड़ें एक डीबी प्रवास लिखें तालिका
  3. LINQ करने के लिए पुन: परिवर्तन करने के लिए एसक्यूएल फ़ाइल
  4. मानचित्र नई संपत्ति

यह एक दर्द है। बड़े पैमाने पर के साथ अपने दृष्टिकोण, अपने मानचित्रण सहायकों सही ढंग से काम करते हैं, मतलब है कि आप क्या करना है:

  1. वस्तु
  2. के लिए प्रॉपर्टी जोड़ें एक डीबी प्रवास लिखें तालिका

नहीं है यही कारण है कि बदलने के लिए खराब। इसके अलावा, ऑब्जेक्ट ग्राफ़ को कैसे संभाला जाएगा? यदि आपके पास 1-एम रिश्ते के साथ एक व्यक्ति तालिका और पता तालिका है जिसका अर्थ है कि किसी व्यक्ति के पास एकाधिक पते हो सकते हैं। आप अपने पते के साथ लोगों की सूची कैसे पूछ सकते हैं और प्राप्त कर सकते हैं? आपका मानचित्रण कैसा दिख रहा है?

एक और दृष्टिकोण यह देखना होगा कि एनएचबीरनेट या इकाई फ्रेमवर्क आपकी स्थिति में काम करेगा या नहीं। वे स्थिर रूप से टाइप की गई वस्तुओं के साथ काम करने के लिए डिज़ाइन किए गए हैं। भारी दिखता है जैसे इसे त्वरित और आसान डेटा पहुंच के लिए डिज़ाइन किया गया है। एक और त्वरित और आसान लाइब्रेरी जो स्थिर रूप से टाइप की गई वस्तुओं के लिए बनाई गई है Dapper है। इसका उपयोग करना आसान है। Nuget पर इसे देखें। असल में, मैं आपकी परिस्थिति के बारे में क्या समझता हूं, मैं दृढ़ता से डैपर पर विचार करता हूं।

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