2008-11-27 11 views
5

त्वरित प्रश्न: क्या यह मेरे डोमेन-संचालित डिज़ाइन शैली भंडारों को सिंगलेट के रूप में लागू करने का अच्छा या बुरा विचार होगा? क्यूं कर?डीडीडी भंडार एकल के रूप में?

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

मैं अभी भी डीडीडी को तुरंत पढ़ रहा हूं, और कुछ अच्छे भंडार उदाहरण देखना चाहूंगा।

उत्तर

2

मैंने ऐसा करने के कुछ तरीके देखे हैं।

सबसे आम तरीका निर्भरता इंजेक्शन का उपयोग उन वस्तुओं में संग्रहित करने के लिए निर्भर करता है जो उन्हें उपयोग करते हैं। आम तौर पर ये प्रस्तुतकर्ता या नियंत्रक वर्ग होते हैं लेकिन कुछ मामलों में मॉडल भंडार में कॉल करता है। आमतौर पर यह बेहतर होता है अगर आप इससे बचें। यदि आप ऐसा करने के लिए एक डी-कंटेनर का उपयोग कर सकते हैं तो इसके लिए जाएं।

आप रिपॉजिटरीज को सिंगलटन पैटर्न को भी लागू कर सकते हैं। मैं इससे बचने की कोशिश करता हूं क्योंकि सिंगलेट आमतौर पर स्थिर तरीकों का उपयोग करते हैं। यह उस कोड का परीक्षण कर सकता है जो सिंगलेट में अधिक कठिन कहता है। यदि आपको इस तरह से काम करना है तो सुनिश्चित करें कि आप सिंगलटन को कॉल करने वाले कोड को अलग करें और "मैनुअल" निर्भरता इंजेक्शन का उपयोग उन वर्गों में सिंगलेट को इंजेक्ट करने के लिए करें जो उन्हें कॉल करते हैं। यह कुछ तंग युग्मन से छुटकारा पाता है जिसे आप अन्यथा प्राप्त करेंगे।

मैंने कुछ उदाहरण देखे हैं जहां भंडार कभी नहीं बुलाए जाते हैं। जब कोई मॉडल में ऑब्जेक्ट ग्राफ़ को नेविगेट करता है और उस ऑब्जेक्ट का अनुरोध करता है जो मॉडल को लोड नहीं करता है तो बस एक ईवेंट उठाता है और रिपॉजिटरी इस घटना पर प्रतिक्रिया करता है। इस तरह भंडार में कोई कॉल नहीं है और यह मॉडल से पूरी तरह से decoupled है। मैंने इस वास्तुकला का उपयोग स्वयं नहीं किया है लेकिन यह बहुत साफ लगता है।

+0

मुझे घटनाओं की अवधारणा के माध्यम से आलसी लोडिंग मिलती है जिसे आपने दिलचस्प बताया है, क्या आप मुझे किसी भी सामग्री या उदाहरणों के बारे में बता सकते हैं जिन्हें आप जानते हैं कि उस रणनीति का उपयोग हो सकता है? मैं इसे अपने स्वयं के उपयोग के लिए मूल्यांकन करना चाहता हूं। – jpierson

+1

@jpierson मैंने खोज की लेकिन कोई उदाहरण नहीं मिला। मुझे याद है कि डीडीडी पर एक वार्ता में घटना दृष्टिकोण का प्रदर्शन करने वाला कोई व्यक्ति है लेकिन ईमानदार होने के लिए यह सब सुंदर सैद्धांतिक था। – Mendelt

3

अपने निर्भरता इंजेक्शन कंटेनर का उपयोग यह तय करने के लिए करें कि कैसे और कहाँ भंडार बनाए जाते हैं।

UserRepository.Instance.Find(userId); 

का उपयोग कर आप परीक्षण के लिए एक बाधा बना रहे हैं।

यदि आपके रिपोजिटरी को कन्स्ट्रक्टर इंजेक्शन का उपयोग करके सेवाओं में पारित किया जाता है, तो आप आसानी से उन्हें मोजे से बदल सकते हैं।

0

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

+0

गैर-सिंगलटन भंडार के साथ स्थिर आंतरिक स्थिति के उपयोग के माध्यम से या NWorkspace पैटर्न जैसे साझा राज्य पैटर्न के माध्यम से आंतरिक भंडार को अन्य भंडारों के अन्य उदाहरणों के साथ साझा करना संभव हो सकता है। – jpierson

0

आइए कहें कि मेरे पास वास्तव में बड़ी परियोजना है, और मैं नई सेवा जोड़ना चाहता हूं कहता हूं कि यह मेरे सिस्टम में कुछ हार्डवेयर प्रतिनिधि होगा। मैं चाहता हूं कि यह सेवा कई कक्षाओं के माध्यम से सुलभ हो, मैं यह सुनिश्चित करना चाहता हूं कि सेवा या परत का केवल एक उदाहरण है जो सेवा तक पहुंच नियंत्रित करता है। मेरे सभी सिस्टम (200+ कक्षाओं) के माध्यम से इस सेवा को इंजेक्शन देना बहुत काम करेगा। मेरे लिए "सिंगलटन" या कुछ "सेवा लोकेटर" इस ​​कार्य के लिए उपयुक्त है।

0

जहां तक ​​मैं समझता हूं कि डोमेन में केवल एक भंडार इंटरफेस है, जिसका अर्थ है कि एक इंटरफेस के लिए कई भंडार कार्यान्वयन हो सकते हैं। तो एक भंडार निश्चित रूप से एक स्थिर वर्ग नहीं हो सकता है, क्योंकि आप एक इंटरफेस में स्थिर तरीकों को परिभाषित नहीं कर सकते हैं। (नोट: कुछ भाषाओं में आप एक इंटरफेस में स्थिर तरीकों को परिभाषित कर सकते हैं, लेकिन यह मेरे लिए ज्यादा समझ में नहीं आता है।)

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

मेरी समझ के लिए यह एक भंडार बनाने के लिए बहुत साफ है जो सुनिश्चित करता है कि आपके पास कई लोगों की बजाय केवल एक इकाई है। यदि आप अपने कोड को single responsibility principle से पूरा करना चाहते हैं तो यह संस्था की स्थिति में नहीं है, न कि इकाई।

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

  • कोई संबंधित समस्या नहीं^_^