2011-02-02 7 views
14

मेरे पास मेरे आवेदन में कुछ कोड है जो मुझे पर किसी भी अन्य निष्पादन से पहले निष्पादित करने की आवश्यकता है, (प्रमाणीकरण से पहले भी) निष्पादित करता है। अब तक मैं अपने ग्लोबल.एक्सएक्स में Application_BeginRequest ईवेंट का उपयोग कर रहा हूं, और इसने ठीक काम किया है। लेकिन इस कोड को डेटाबेस को हिट करने की जरूरत है, और ग्लोबल.एक्सएक्स से ऐसा करने से कुछ कारणों से सही नहीं लगता है। इसके अलावा, मैं उपयोग कर रहा हूँ Ninject.MVC3 nuget मेरे एचटीपी अनुप्रयोग ctor में निर्भरता इंजेक्षन नहीं करेगा।एमवीसी 3 में BeginRequest- जैसे फ़िल्टर?

तो मैंने जो करने का फैसला किया वह इस कोड को अपने वैश्विक क्रिया फ़िल्टर में ले जाया गया है। अब मेरी समस्या यह है कि कोई फर्क नहीं पड़ता कि ऑर्डर या फ़िल्टरस्कोप मैं इस फ़िल्टर को देता हूं, मैं इसे पहले निष्पादित नहीं कर सकता; मेरा प्राधिकरण फ़िल्टर हमेशा इसे धड़कता है।

फ़िल्टर क्रम

फिल्टर निम्न क्रम में चलाएँ::

  1. प्राधिकरण फिल्टर
  2. कार्रवाई फिल्टर
  3. रिस्पांस फिल्टर
  4. अपवाद फिल्टर MSDN इस बात की पुष्टि करने लगता है

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

मैं जानता हूँ कि मैं एक HttpModule उपयोग कर सकते हैं, लेकिन यह बहुत MVCish महसूस नहीं करता है, तो मैं उस मार्ग है, जो मेरे सवाल की ओर जाता है जाने से पहले सभी possiblities निकास कोशिश कर रहा हूँ:

है वैश्विक एक्शन फ़िल्टर के लिए एक BeginRequest बराबर है?

उत्तर

16

आप एक आधार नियंत्रक के Initialize विधि में ऐसा कर सकता है।

एक और संभावना है रजिस्टर करने के लिए है एक global filter:

public class MyGlobalFilter : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     // that's gonna be hit 
    } 
} 

और अपने Global.asax की RegisterGlobalFilters स्थिति में:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new HandleErrorAttribute()); 
    filters.Add(new MyGlobalFilter()); 
} 
+0

मैं डि उपयोग कर रहा हूँ, इसलिए नए ऑपरेटर बाहर है :(में प्रारंभ एक बेस नियंत्रक ने काम किया। हालांकि, बेस प्रकार से उत्तराधिकारी होने के लिए मजबूर होना थोड़ा सा प्रतिबंध लग रहा है; पूरे कारण से मैं फिल्टर के साथ इसे पूरा करने की कोशिश कर रहा था (या - अनावश्यक रूप से - HTTP मॉड्यूल) उनकी मॉड्यूलरिटी के कारण है। –

+0

@ डैनियल, जो आपको 'फ़िल्टर करने के लिए रोकता है। जोड़ें (DIContainer.Get ());' यदि आप 'नया' ऑपरेटर का उपयोग नहीं करना चाहते हैं? –

+0

मुझे ऐसा करने से रोकने में कुछ भी नहीं है। लेकिन मैं कंटेनर को सीधे कॉल नहीं करना चाहूंगा, क्योंकि यह सेवा स्थान होगा, नियंत्रण में उलटा नहीं होगा। साथ ही, मैं अपने कोड को इतनी कसकर निनजेक्ट के साथ जोड़कर सहज महसूस नहीं कर रहा हूं, इसलिए मैं अपना कर्नेल रखने की कोशिश कर रहा हूं। () से न्यूनतम तक प्राप्त करें। –