2010-04-08 16 views
8

का उपयोग करके आलसी लोडिंग के साथ रिपोजिटरी पैटर्न मैं एक नई परियोजना शुरू करने और व्यवसाय वस्तुओं और डेटा पहुंच आदि बनाने की प्रक्रिया में हूं। मैं किसी भी ओएमएस की बजाय सादे पुराने क्लियर ऑब्जेक्ट्स का उपयोग कर रहा हूं। मैंने दो वर्ग पुस्तकालयों का निर्माण किया है: 1) व्यवसाय ऑब्जेक्ट्स - मेरे सभी व्यावसायिक वस्तुओं को रखता है, ये सभी वस्तुएं केवल गुणों और व्यावसायिक नियमों के साथ हल्के वजन हैं। 2) रिपोजिटरी - यह मेरे सभी डेटा एक्सेस के लिए है।पीओसीओ

मेरी अधिकांश वस्तुओं में बाल सूची होगी और मेरा प्रश्न यह है कि इन मूल्यों को आलसी लोड करने का सबसे अच्छा तरीका क्या है क्योंकि अगर मुझे आवश्यकता नहीं है तो मैं अनावश्यक जानकारी वापस नहीं लेना चाहता हूं।

मैंने सोचा है कि बच्चे की संपत्ति पर "पाने" का उपयोग करने के बारे में सोचा गया है कि क्या यह "शून्य" है और यदि यह बच्चे की जानकारी प्राप्त करने के लिए मेरा भंडार कहलाता है। इसमें से दो समस्याएं हैं जो मैं देख सकता हूं: 1) ऑब्जेक्ट "जानता है" खुद को कैसे प्राप्त करें मैं ऑब्जेक्ट में कोई डेटा एक्सेस तर्क नहीं रखूंगा। 2) यह दोनों वर्गों को एक-दूसरे को संदर्भित करने की आवश्यकता है जो दृश्य स्टूडियो में एक परिपत्र निर्भरता त्रुटि फेंकता है।

क्या किसी के पास इस समस्या को दूर करने या मेरे प्रोजेक्ट लेआउट पर किसी भी सिफारिश को दूर करने के बारे में कोई सुझाव है और जहां इसे बेहतर किया जा सकता है?

धन्यवाद

उत्तर

2

प्रदान किए गए उत्तरों और आगे के शोधों को देखने के बाद मुझे एक लेख मिला जो आलसी लोडिंग के लिए प्रतिनिधियों का उपयोग करता है। इसने प्रॉक्सी का उपयोग करने या एनएचबेर्नेट को लागू करने से एक आसान समाधान प्रदान किया।

यहां लेख में link है।

0

अपने आलसी लोड हो रहा है कोड कार्यावधि में भंडार (Activator.CreateInstance या कुछ इसी तरह) लोड हो जाता है और उसके बाद प्रतिबिंब के माध्यम से उचित विधि कॉल करता है, तो आप एक सर्कुलर निर्भरता समस्या के समाधान प्राप्त कर सकते हैं। बेशक प्रतिबिंब से जुड़े प्रदर्शन दंड हैं, लेकिन ज्यादातर समाधानों में अक्सर महत्वहीन हो जाते हैं।

इस समस्या को हल करने का एक और तरीका केवल एक एकल डीएल को संकलित करना है - यहां आप अलग-अलग नामस्थानों का उपयोग करके अपनी परतों को तार्किक रूप से अलग कर सकते हैं, और फिर भी विभिन्न निर्देशिकाओं का उपयोग करके अपनी कक्षाओं को व्यवस्थित कर सकते हैं।

3

ऐसा करने के लिए आपको इंटरफेस (कार्यान्वयन पर abstractions) और/या अपनी संपत्तियों को आभासी घोषित करने की आवश्यकता है। फिर आपका भंडार उन गुणों के लिए प्रॉक्सी ऑब्जेक्ट देता है जिन्हें आलसी लोड किया जाना है। वह वर्ग जो भंडार कहता है वह कोई भी बुद्धिमान नहीं है, लेकिन जब वह उन गुणों में से किसी एक तक पहुंचने का प्रयास करता है, तो प्रॉक्सी डेटाबेस को कॉल करता है और मानों को लोड करता है।

सचमुच, मुझे लगता है कि यह स्वयं को लागू करने की कोशिश करने के लिए पागलपन है। वहां इस समस्या के लिए महान, समय-परीक्षण समाधान हैं, जिन्हें .NET में सबसे महान दिमागों द्वारा विकसित और परिष्कृत किया गया है।

प्रॉक्सी करने के लिए, आप Castle DynamicProxy का उपयोग कर सकते हैं, या आप NHibernate का उपयोग कर सकते हैं और इसे आपके लिए सभी प्रॉक्सी और आलसी लोडिंग को संभालने दें (यह डायनेमिक प्रॉक्सी का उपयोग करता है)। किसी भी हाथ से लुढ़काए कार्यान्वयन की तुलना में आपको बेहतर प्रदर्शन मिलेगा, गारंटीकृत।

एनएचबेर्नेट आपके पीओसीओ के साथ गड़बड़ नहीं करेगा - कोई विशेषता नहीं, कोई आधार वर्ग नहीं; प्रॉक्सी पीढ़ी की अनुमति देने के लिए आपको केवल वर्चुअल वर्चुअल को चिह्नित करने की आवश्यकता है।

बस शब्दों में कहें, मैं एक ओआरएम का उपयोग करके पुनर्विचार करना चाहता हूं, खासकर यदि आप आलसी लोडिंग चाहते हैं; आपको अपने पीओसीओ को छोड़ना नहीं है।

1

यदि आप एंटीटी फ्रेमवर्क 4.0 का उपयोग कर रहे हैं, तो आपको पीओसीओ के लिए स्थगित लोडिंग & के साथ समर्थन मिलेगा ताकि आप डेटा एक्सेस करने के लिए एक सामान्य भंडार लिख सकें।

ईएफ 4 के साथ जेनेरिक रिपोजिटरी पैटर्न पर ऑनलाइन लेख हैं।0

एचटीएच।

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