2012-05-30 15 views
14

यह देखते हुए कि मेरे पास केवल ControllerContext तक पहुंच है और Action____Contexts वर्तमान निष्पादन एक्शनडिस्क्रिप्टर प्राप्त करने का सबसे अच्छा तरीका क्या है?कंट्रोलर कॉन्टेक्स्ट से एक्शन डिस्क्रिप्टर

अब तक केवल विधि मैंने पाया है:

new ReflectedControllerDescriptor(context.Controller.GetType()) 
    .FindAction(context, context.RouteData.GetRequiredString("action")); 

इस इष्टतम विधि है?

तथ्य यह है कि कक्षा का नाम ReflectedControllerDescriptor है, मुझे आश्चर्य है कि इस ऑपरेशन के लिए भारी लागत है क्योंकि इसे प्रत्येक पृष्ठ अनुरोध पर निष्पादित किया जाएगा? इससे संबंधित यह वर्ग आंतरिक रूप से कैश करता है या क्या मुझे वास्तव में ReflectedControllerDescriptors कैशिंग करनी चाहिए?

+0

एमवीसी स्रोत में कुछ खुदाई करना जो कि आप पहले से ही कर रहे सभी कार्यों को कॉपी किए बिना सबसे अधिक अनुकूल तरीका है। हालांकि, मुझे नहीं लगता कि आप पाए गए कार्यों को कैश क्यों नहीं कर पाएंगे ताकि बाद के कार्य अधिक प्रदर्शनशील हों। – Buildstarted

+0

इसके अलावा प्रतिबिंबित नियंत्रक डिस्क्रिप्टर क्रियाएं प्राप्त करने के लिए प्रतिबिंब का उपयोग करता है क्योंकि यह न केवल विधियों को देखता है बल्कि विधियों से जुड़ी विशेषताओं को भी देखता है। (प्रतिबिंबित नियंत्रक डिस्क्रिप्टर भी परिणामों को कैश करता है) – Buildstarted

+0

@ बिल्डल्डस्टार्ट इसलिए 'प्रतिबिंबित नियंत्रक डिस्क्रिप्टर' के अंदर प्रतिबिंब उपयोग वास्तव में कैश किया गया है, लेकिन तर्कसंगत रूप से मैं FindAction पर अपनी कॉल कैश कर सकता हूं? –

उत्तर

9

एमवीसी स्रोत में कुछ खुदाई करना जो कि आप पहले से ही कर रहे सभी कार्यों को कॉपी किए बिना सबसे अधिक अनुकूल तरीका है। हालांकि, मुझे नहीं लगता कि आप पाए गए कार्यों को कैश क्यों नहीं कर सके ताकि बाद की कॉल अधिक प्रदर्शनशील हो।

आंतरिक रूप से ReflectedControllerDescriptor परिणामों को कैश करता है हालांकि कुछ ओवरहेड लगता है क्योंकि यह हर बार सभी विशेषताओं की जांच करता है। यह HttpPostAttribute जैसी चीजों के लिए दिखता है और क्या नहीं।

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

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