2010-08-01 10 views
8

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

उदाहरण के लिए:

// entity framework generated 
partial class Lap { 
    int Id { /* boilerplate */ } 
    DateTime StartTime { /* etc */ } 
    DateTime EndTime { /* etc */ } 
} 

// in my partial class (written by me) 
partial class Lap { 
    TimeSpan Duration { 
    get { return EndTime - StartTime; } 
    } 
} 

यह बुरा व्यवहार सीधे इकाई द्वारा जेनरेट की कक्षाओं पर अतिरिक्त तर्क ड्रॉप करने है? क्या मुझे इस तर्क के लिए एक और डोमेन परत बनाना चाहिए?

उत्तर

10

आप बहुत ही काम कर रहे हैं जिसके लिए आंशिक कक्षाएं डिजाइन की गई थीं; विरासत के पेड़ को कम किए बिना कोड-जेनरेटेड क्लास में प्रासंगिक तर्क जोड़ना। कीप आईटी उप।

अलावा:

सभी आदिवासी ज्ञान के फ़ॉन्ट में एक पृष्ठ से, Wikipedia (जोर जोड़ा):

आंशिक वर्गों का उद्देश्य है करने के लिए एक वर्ग की परिभाषा कई भर में अवधि के लिए अनुमति देते फ़ाइलें। यह के लिए विशेष रूप से उपयोगी है:

  • बहुत बड़े वर्ग (जहां यह बोझिल है एक एकल फाइल के माध्यम से एक संपादक के साथ नेविगेट करने)
  • चिंताओं का पृथक्करण, एक तरह से पहलू-ओरिएंटेड प्रोग्रामिंग लेकिन के समान किसी भी अतिरिक्त उपकरण का उपयोग किए बिना। एक उदाहरण नीचे दिखाया गया है।
  • एकाधिक डेवलपर्स को पर एक ही कक्षा पर काम करने के लिए बाद में स्रोत नियंत्रण में फ़ाइलों को विलय करने की आवश्यकता के बिना अनुमति देना।
  • वर्ग इंटरफेस और कार्यान्वयन से संबंधित परिभाषाएँ (सार्वजनिक की अलग-अलग परिभाषा और गुप्तांगों)
  • इस तरह के दृश्य डिजाइनरों के रूप में कोड जनरेटर, के लेखन Easing जो जुदाई की अनुमति दे। यह शायद सबसे उपयोगी कारण है। यह कोड जनरेटर जब यह में मानव-लिखे कोड रखा गया है कि उत्पन्न कोड का प्रबंधन कर सकते विकसित करने के लिए एक चुनौती है:
    • अनावश्यक कोड को पार्स का एक बहुत आवश्यक है, बस के लिए एक जगह खोजने के लिए जेनरेट कोड डालें। कोड को बदलना भी एक समस्या है। खराब लिखित जेनरेटर पूरे फ़ाइल को नुकसान पहुंचाने के संभावित जोखिम को पकड़ते हैं।

आंशिक वर्गों का उपयोग करना, कोड जनरेटर एक अलग फाइल प्रोसेस करता है, और इस प्रकार सभी से कम किया जाता है इसके बाद के संस्करण की समस्याओं का उल्लेख किया।

+0

यहां, यहां! इसके लिए +1। – Lazarus

+0

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

+0

+1। अगर मैं आपको ताज़ा प्रोत्साहन के लिए एक और +1 दे सकता हूं, तो यह देखना हमेशा अच्छा होता है। –

2

मुझे इसे पीओसीओ को करने के लिए स्वीकार करना है और इसे बहुत उत्पादक मिला है।अन्य आम उपयोग

  • FULLNAME = FirstName + "" + उपनाम
  • CostIncl = वैट रहित + टैक्स
  • कभी-कभी बच्चे संस्थाओं में भी कुल योग (जैसे InvoiceTotal = सभी LineItem.Totals का योग) कर सकते हैं

आदि

कुछ चेतावनियां हैं

  • यदि आप इन इकाइयों को सीधे तार पर भेज रहे हैं (उदा। डब्ल्यूसीएफ या एएसएमएक्स), सुनिश्चित करें कि उन्हें सीरियलज़ेबल/डेटामेम्बर के रूप में चिह्नित नहीं किया गया है, क्योंकि वे एक सेटर
  • और यदि आप नहीं हैं (उदाहरण के लिए तार में या एमवीवीएम प्रयोजनों के लिए उन्हें मैप करना) प्रयास
  • संपादित करें: स्टीफन की टिप्पणी के अनुसार, एक LINQ क्वेरी (जो SQL को हिट करता है) में व्युत्पन्न संपत्ति का उपयोग कर विफल हो जाएगा (क्योंकि इसे SQL में मैप नहीं किया जा सकता है)।
+0

एक अतिरिक्त चेतावनी: जब आप कस्टम गुणों को परिभाषित कर रहे हैं, जैसे 'पूर्णनाम {get {return firstname + "" + उपनाम; }} '(या 'उसके मामले में अवधि'), कृपया ध्यान दें कि LINQ क्वेरी में इस प्रॉपर्टी का उपयोग रनटाइम पर विफल हो जाएगा। – Steven

+0

हेड-अप स्टीवन के लिए धन्यवाद। कुछ 'औसत अवधि = लापता। औसत (लैप => गोद। अवधि। मिलिसेकंड)' की तरह कुछ भी असफल हो जाएगा? क्या यह केवल IQueryable क्वेरी (यानी, ईएफ का उपयोग करके) पर लागू होता है या क्या यह linq-to-items में भी असफल हो सकता है? उदाहरण के लिए 'laps.AsEumerable() औसत (गोद => गोद। अवधि। मिलिसेकंड) ' – guhou

0

इकाई फ्रेमवर्क का उपयोग करते समय संस्थाओं के आंशिक वर्गों का उपयोग करना बुरा नहीं है। हालांकि, आपको यह सुनिश्चित करने की आवश्यकता है कि आप आंशिक कक्षाओं के सदस्यों में डेटा एक्सेस लॉजिक के साथ व्यावसायिक तर्क को मिश्रित न करें। अन्यथा, डेटाबेस से कनेक्ट किए बिना इकाई परीक्षण कोड लिखना मुश्किल होगा।

WPF Application Framework (WAF) की BookLibrary नमूना दिखाता है एक WPF MVVM आवेदन जब डोमेन परत एफई संस्थाओं का उपयोग करता है की तरह लग रहे हो सकता है कि कैसे।

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

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