2009-05-20 15 views
55

जब मैं .NET (Winforms, WPF, ASP.NET) पर बड़े पैमाने पर एंटरप्राइज़-व्यापी ऐप्स बनाने की बात करता हूं तो मुझे दो मुख्य "विचारों के स्कूल" दिखाई देते हैं।रिपोजिटरी पैटर्न बनाम "स्मार्ट" व्यावसायिक ऑब्जेक्ट्स

कुछ लोग "रिपोजिटरी पैटर्न" का उपयोग करते हैं जो एक भंडार का उपयोग करता है जो वस्तुओं को लाने, डालने, अपडेट करने और हटाने के बारे में जानता है। उन वस्तुओं की बजाय "गूंगा" है कि उनमें जरूरी नहीं है कि वे पूरी तरह से तर्क लें - उदा। वे कम या ज्यादा डेटा हस्तांतरण वस्तुओं हैं।

अन्य शिविर मैं "स्मार्ट" व्यावसायिक वस्तुओं को कॉल करता हूं जो जानते हैं कि खुद को कैसे लोड करना है, और उनके पास आमतौर पर एक सहेजें(), संभवतः अद्यतन() या यहां तक ​​कि हटाएं() विधि है। यहां आपको वास्तव में किसी भी भंडार की आवश्यकता नहीं है - ऑब्जेक्ट्स स्वयं जानते हैं कि खुद को कैसे लोड और सहेजना है।

बड़ा प्रश्न है: आप किसका उपयोग करते हैं या पसंद करते हैं? और क्यों?

क्या आप अपने सभी ऐप्स में एक ही दृष्टिकोण का उपयोग करते हैं, या क्या आपके पास कोई अन्य मानदंड चुनने के लिए कोई विशेष मानदंड है? यदि हां - तो वे मानदंड क्या हैं?

मैं यहां लौ-युद्ध शुरू करने की कोशिश नहीं कर रहा हूं - बस यह जानने का प्रयास कर रहा हूं कि हर कोई इस बारे में क्या सोचता है और आपकी राय क्या है, और आप दूसरे पर एक (या दोनों) पैटर्न का उपयोग क्यों करते हैं।

किसी भी रचनात्मक इनपुट के लिए धन्यवाद!

उत्तर

38

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

+3

उस स्थिति में, एक सामान्य भंडार को तब पता होना चाहिए कि सभी प्रकार की वस्तुओं को कैसे लोड किया जाए। –

+0

और क्योंकि यह सामान्य है यह सभी प्रकार की वस्तुओं को लोड करने में संभाल सकता है। यूनिट परीक्षण को भी आसान बनाता है –

+4

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

15

द्वारा नियंत्रित किया जा सकता है, तो भंडार पैटर्न आवश्यक नहीं है। यदि ऑब्जेक्ट्स में सेव/अपडेट के बाहर कोई तर्क नहीं है, तो आप शायद ऑब्जेक्ट के बाहर बहुत अधिक कर रहे हैं।

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

इसलिए यदि आप सीआरयूडी परिचालनों के साथ सरल डीटीओ ऑब्जेक्ट्स का उपयोग करते हैं तो ऑब्जेक्ट्स एनीमिक नहीं होना चाहिए।

फिर अपनी ऑब्जेक्ट चिंताओं से दृढ़ता से संबंधित चिंताओं को अलग करना एकल जिम्मेदारी रखने का एक अच्छा तरीका है।

+0

नहीं, निश्चित रूप से - मेरा बसोब पूरी तरह से "गूंगा" नहीं है - मेरा मतलब सिर्फ "गूंगा" है कि वे खुद को लोड करने और सहेजने के बारे में नहीं जानते हैं - उनके पास अन्य कार्यक्षमता है, obviuosly :-) –

+0

यह सनी है डिज़ाइन। मैं व्यक्तिगत रूप से देखता हूं कि "बो खुद को लोड करना जानता है" क्योंकि डेवलपर को किराए पर नहीं लेना - ई ने स्पष्ट रूप से उत्तरदायित्व को अलग करने के बारे में कभी नहीं सुना और कभी भी सही ढंग से encapsulaed DAL नहीं देखा है। – TomTom

+0

क्या आपने सीएसएलए का उपयोग किया है? यह एक परियोजना पर बहुत अच्छी तरह से काम करता है जिस पर हमने इसका उपयोग किया था जिसमें एन-स्तरीय तैनाती शामिल थी। – Fireworks

4

मुझे लगता है कि रिपोजिटरी पैटर्न बनाम ActiveRecord पैटर्न का उपयोग करने का सबसे महत्वपूर्ण दुष्प्रभाव परीक्षण और विस्तारशीलता है।

आपके ActiveRecord ऑब्जेक्ट के बिना एक भंडार स्वयं भी आपके परीक्षण मामलों में डेटा पुनर्प्राप्ति को अलग कैसे करेगा? आप वास्तव में नकली नहीं हो सकते हैं या आसानी से नकली नहीं कर सकते हैं।

परीक्षण के अलावा डेटा एक्सेस टेक्नोलॉजीज को स्वैप करना भी मुश्किल होगा, उदाहरण के लिए लिंक-टू-एसक्यूएल से एनएचबर्ननेट या एंटिटीफ्रेमवर्क (हालांकि यह अक्सर स्वीकार्य रूप से नहीं होता है)।

1

यह वास्तव में आवेदन की जरूरतों पर निर्भर में आए हैं, लेकिन जब एक जटिल व्यापार मॉडल के साथ काम कर, मैं ActiveRecord पसंद करते हैं।मैं एक ही स्थान पर व्यवसाय तर्क को समाहित (और परीक्षण) कर सकता हूं।

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

ActiveRecord का उपयोग करके, मुझे "इकाई" बेस क्लास होना पसंद है। मैं आम तौर पर इस बेस क्लास के साथ एक ओआरएम (रिपोजिटरी) का उपयोग करता हूं, इसलिए मेरी सभी इकाइयों में GetById, AsQueryable, Save और Delete विधियां हैं।

यदि मैं एक सेवा ओरिएंटेड आर्किटेक्चर का अधिक उपयोग कर रहा हूं, तो मैं एक भंडार का उपयोग करूंगा (एक जो सीधे डेटा एक्सेस या एक ओआरएम मास्क करता है) और इसे सीधे मेरी सेवाओं में कॉल करें।

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