2010-07-27 12 views
21

का उपयोग करते हुए सिंगलटन बनाम क्षणिक बनाम अनुरोध का उपयोग कब करें जब मुझे सिंगलटनस्कोप() बनाम ट्रांजिएंटस्कोप() बनाम RequestScope() का उपयोग करना चाहिए, जब मैं अपनी global.cs फ़ाइल में बाध्यकारी करता हूं।निनजेक्स और मोंगोडीबी

मैं उदाहरण के लिए MongoSession (आदर्श का उपयोग करने और mvcStarter परियोजना http://mvcstarter.codeplex.com/) करने के लिए अपने फोन है जो SingletonScope के लिए निर्धारित है, लेकिन मैं एक भंडार है कि आसान मोंगो के लिए, उदाहरण के लिए कॉल करने के लिए इस MongoSession वस्तु का उपयोग बनाया है, मैं एक NewsRepository है जो डेटा से अपने समाचार आइटम लाने के लिए MongoSession का उपयोग करता है। एक उदाहरण के रूप में मेरे पास एक कॉल है जो न्यूज़ आइटम प्राप्त करता है जिसमें DisplayOnHome सत्य पर सेट है और CreationDate द्वारा नवीनतम प्राप्त करें। क्या ऐसा भंडार सिंगलटनस्कोप होना चाहिए या अनुरोध स्कोप अधिक उपयुक्त होगा?

मुझे इसका उपयोग कब करना चाहिए और क्यों?

+0

यह भी देखें: http: // stackoverflow!।कॉम/प्रश्न/333844 9 (मेरे उत्तर में था, लेकिन किसी ने इसे काटने का फैसला किया ताकि यह प्रासंगिक न हो) –

+0

@ रूबेनबार्टेलिंक कृपया लिंक अपडेट करें। यह टूटा हुअा है। – shankbond

+0

@shankbond प्रश्न quwitoner द्वारा हटा दिया गया प्रश्न –

उत्तर

21

सामान्य रूप से एक वेब ऐप में, आप चाहते हैं कि राज्य जितना संभव हो सके दायरे का अनुरोध करे।

केवल बहुत कम स्तर अनुकूलन के मामले में आप एक मामले में चलाने के लिए कभी संभावना है जहां इसकी सिंगलटन वस्तुओं (और संभावना फिर भी बनाने के लिए है कि आप किसी अन्य वर्ग में इस तरह के कैशिंग/साझा तर्क बाहर खींच जाएगा रहे हैं उचित जो आपके अन्य [अनुरोध स्कोप] ऑब्जेक्ट्स पर निर्भरता के रूप में खींचा जाता है और बनाता है सिंगलटन स्कोप)। याद रखें कि एक वेब ऐप के संदर्भ में एक सिंगलटन का अर्थ एक ही ऑब्जेक्ट का उपयोग करके कई धागे हैं। यह शायद ही कभी अच्छी खबर है।

इसी आधार पर, क्षणिक दायरा सबसे सरल डिफ़ॉल्ट है (और यही वजह है कि निनजेक्ट 2 इसे बनाता है) - अनुरोध के दायरे को केवल समीकरण में आना चाहिए जब प्रदर्शन कारणों के लिए कुछ साझा करने की आवश्यकता होती है (या क्योंकि यह केवल साझाकरण का संदर्भ है [जैसा कि अन्य उत्तरों में उल्लिखित है])।

+0

ठीक है कि यह एक अच्छा वर्णन है, इसलिए मुझे अधिकांश समय अनुरोध स्कोप का उपयोग करना चाहिए, लेकिन रॉब एमवीसी स्टार्टर प्रोजेक्ट में मोंगोशन के लिए सिंगलटनस्कोप का उपयोग क्यों करता है? – VinnyG

+0

यदि 'मोंगोसेशन' थ्रेडसेफ है (जो निश्चित रूप से मामला होगा यदि यह किसी भी राज्य को बनाए रखता है), सिंगलटन ठीक है [लेकिन अन्य दो भी काम करेंगे]। यदि आप सामान साझा करना चाहते हैं तो सिंगलटन जाने के लिए केवल जरूरी है (और अगर उदाहरणों का निर्माण महंगा हो तो यह लाभ हो सकता है)। सामानों को लंबे समय तक जीवित रखना और इसे कई धागे से एक्सेस करना ठीक हो सकता है यदि सभी 'यह निर्भर करता है' बिट्स (थ्रेड सुरक्षित, कैश किए गए राज्य को कभी भी डंप करने की आवश्यकता नहीं होती है, एकाधिक धागे आदि से उपयोग करने में सक्षम) संतुष्ट हैं - यह सिर्फ अच्छा नहीं है चूक। उम्मीद है कि यह कुछ हद तक स्पष्ट करता है। –

+0

अन्य प्रकार के ऐप के बारे में क्या? – Rushino

3

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

यदि आपका MongoSession है नहीं काम की एक इकाई है, आप इसे चारों ओर एक MVC सत्र के जीवनकाल, जिसमें मामले SessionScope तो उचित होगा के लिए रख सकते हैं।

+0

नीचे उत्तर के रूप में जोड़ना MongoSession काम की एक इकाई नहीं है, उत्तर के लिए धन्यवाद! – VinnyG

0
नष्ट कर दिया सवाल से

के रूप में ऊपर


@shankbond द्वारा अनुरोध Dispos अल आवश्यक रूप से अपने मुख्य अनुरोध धागे पर तुल्यकालिक नहीं किया जाता है के रूप में एक मान सकता है।

आप शायद छिपाया जा एक Block और उसके बाद आपके अनुरोध में कोई उचित चरण में यह Dispose() चाहते हैं (आप कैसे अपवाद को संभालने के लिए जा रहे हैं?)

अधिक उदाहरण (गंभीरता के लिए Ninject टेस्ट मैचों में एक नज़र, जाना देखो - वे छोटे और स्पष्ट कर रहे हैं और मैं इसे पछतावा नहीं था जब मैं 3 बार मैं करने के लिए कहा गया था सुनी)

देखें http://kohari.org/2009/03/06/cache-and-collect-lifecycle-management-in-ninject-20/