2012-05-26 15 views
5

मैं वर्तमान में एक सी # एमवीसी रीस्ट वेब एपीआई विकसित कर रहा हूं, और हमारे डिजाइन के लिए दो संभावनाओं में से एक के बीच चयन करने की कोशिश कर रहा हूं।सी # स्टेटिक इंस्टेंस बनाम ऑब्जेक्ट इंस्टेंस

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

जो मैं तय करने का प्रयास कर रहा हूं वह एक स्थिर वर्ग ExecuteQuery फ़ंक्शन के साथ एक स्थिर वर्ग लिख रहा है, या इन वर्गों के उदाहरण बनाने के लिए एक कारखाना विधि लिख रहा है, जिसमें ExecuteQuery नामक एक उदाहरण विधि है।

कई, अल्पकालिक वस्तुओं हर अनुरोध बनाने, स्थिर तरीकों बुला बनाम के बीच प्रदर्शन विचार क्या हैं?

सहजता से, स्थिर तरीके तेज हो जाएंगी, लेकिन मुझे पहले से ही उम्मीद है कि मैं प्रतिबिंब के माध्यम से उन्हें बुलाए जाने वाले सिरदर्द में थोड़ा सा भागूंगा (गर्म लोड कोड आवश्यकता का समर्थन करने के लिए)।

अगर वहाँ अल्पकालिक वस्तुओं के लिए एक बहुत बड़ा दंड नहीं है, तो वे बाहर सादगी पर अकेले जीत सकता।

हमारे उम्मीद भार के बारे में प्रासंगिक जानकारी:

300 मि.से में
  • रिस्पांस बार - 800ms रेंज
  • लगभग 2000 वेब ग्राहकों के बारे में 4000 ग्राहकों
  • ग्राहक प्रश्नों करने का
  • पीक लोड के औसत लोड प्रत्येक 2 - 5 सेकंड
  • क्लाइंट पीक दर प्रत्येक प्रश्न

इसके अलावा, प्रत्येक DataSource अधिकतम 8, इन उदाहरणों में से 3 का औसत बनाएगा।

+0

शायद आपके प्रतिबिंब का उपयोग करने का इरादा स्थैतिक-बनाम उदाहरण उपयोग से बड़ा प्रदर्शन हिट करेगा। जैसा कि अन्य ने टिप्पणी की है, आपको वह फॉर्म चुनना चाहिए जो सबसे _design_ sense बनाता है। वैकल्पिक रूप से, चूंकि आपके पास कुछ इच्छित मेट्रिक्स हैं, इसलिए आप स्थिर/आवृत्ति कार्यान्वयन का नकल कर सकते हैं और आपको जिस ओवरहेड का सामना करना पड़ेगा उसका एहसास हो सकता है। –

उत्तर

1

एक स्थिर वर्ग का उपयोग करें, जो कार्यान्वयन कक्षाओं को कॉल का प्रतिनिधित्व करता है।

इन कार्यान्वयन वर्गों को एक सामान्य इंटरफ़ेस लागू करना चाहिए, जो आपको प्रतिबिंब की आवश्यकता के बिना उन पर विधियों को कॉल करने की अनुमति देगा। और निश्चित रूप से, स्थिर तरीके इंटरफ़ेस विधियों को लागू नहीं कर सकते हैं। इंटरफेस कार्यान्वयन के उदाहरण होना चाहिए, आपको उन्हें तत्काल करने के लिए किसी प्रकार का कारखाना चाहिए। यदि वे बाहरी असेंबली में रहते हैं, तो मैं दृढ़ता से सुझाव देता हूं कि आप प्रबंधित एक्सटेंसिबिलिटी फ्रेमवर्क (एमईएफ) पर नज़र डालें, http://msdn.microsoft.com/en-us/library/dd460648.aspx देखें।

प्रत्येक अनुरोध के एकाधिक, अल्पकालिक वस्तुओं को बनाने के बीच प्रदर्शन विचार क्या हैं, बनाम स्थैतिक तरीकों को बुला रहा है? यह देखते हुए कि ये विधियां डेटा एक्सेस करेंगे, प्रदर्शन प्रभाव पूरी तरह से पूरी तरह से और पूरी तरह से लापरवाही योग्य हैं।

यदि आप एमईएफ का उपयोग करते हैं, तो ढांचा आपके लिए सिंगलटन जैसी घटनाएं पैदा करेगा।

यदि आप अपनी भूमिका निभाते हैं, और इन वस्तुओं को कई बार बनाने की आवश्यकता को हटाना चाहते हैं, तो आप उन पर सिंगलटन पैटर्न को कार्यान्वित कर सकते हैं।

+0

मैंने उन पर सिंगलटन पटर का उपयोग करके बहस की थी, लेकिन अभी तक कोई निर्णय नहीं लिया था। मुझे लगता है कि एमईएफ वही होगा जो मैं ढूंढ रहा हूं। धन्यवाद! –

0

मुख्य निर्णय "क्या इस वस्तु का राज्य होना चाहिए?"

यदि "नहीं", तो हर तरह से, इसे एक स्थिर विधि बनाएं।

IMHO .. PSM

+0

दुर्भाग्यवश, सभी संभावित वस्तुओं की आवश्यकताएं अभी तक नहीं हैं, इसलिए मुझे नहीं लगता कि उनके पास राज्य होगा, मैं इस चरण में 100% निश्चित नहीं हो सकता। –

1

मुझे लगता है हर DataSource उदाहरण डेटाबेस के लिए एक नया कनेक्शन कर देगा। यदि ऐसा है, तो यह केवल एक उदाहरण के लिए समझ में आता है। यह पता लगाने का एकमात्र तरीका है कि "यह एक बड़ा जुर्माना है" दोनों समाधानों और प्रोफाइल का मॉक-अप बनाना है और देखें कि प्रभाव महत्वपूर्ण है या नहीं।

  • के बाद आप एक बार में कई ग्राहकों है लगता नहीं है, इसलिए यह भी बैठता है सिंगलटन पैटर्न के साथ होगा।
  • कई समवर्ती प्रश्न नहीं (अधिकतर उपरोक्त कथन के कारण)।
  • आपके पास प्रतिक्रिया समय का एक निश्चित विनिर्देश है।

फैक्टरी पैटर्न के लिए मैं केवल एकमात्र तर्क "सादगी" के लिए कर सकता हूं। अगर परियोजना वास्तव में समय संवेदनशील है, तो मुझे लगता है कि आपके पास कोई विकल्प नहीं है। लेकिन अगर आप वास्तव में प्रदर्शन चाहते हैं, तो सिंगलटन के साथ जाएं।

1

MEF का उपयोग करें। अपने प्लगइन ढांचे का आविष्कार करने की कोई जरूरत नहीं है। यह आपको इंटरफेस के माध्यम से प्रकट उदाहरण विधियों की ओर ले जाएगा। प्रति-अनुरोध ऑब्जेक्ट्स बनाना असामान्य नहीं है ... एमवीसी फ्रेमवर्क पूरे स्थान पर करता है। प्रति-अनुरोध उदाहरण डेटा एक्सेस परिदृश्यों के लिए विशेष रूप से अच्छी बात है ताकि आप लेन-देन/रोलबैक जैसी चीजों का समर्थन कर सकें, जहां उपयोगकर्ता का अनुभव अन्य उपयोगकर्ताओं को प्रभावित नहीं करता है जब तक कि आप इसे स्पष्ट रूप से नहीं बनाते। प्रतिक्रिया कैशिंग का उपयोग करें जहां उपयुक्त है अगर perf एक समस्या है।

+0

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