2014-10-10 9 views
5

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

public ActionResult MainMenu() 
{ 
    CreateLog(); 

    // Do controller stuff 
    Log(message); 
    // Do more controller stuff 

    CloseLog(); 
    return View(mModel); 
} 

या मैं एक using ब्लॉक इस्तेमाल कर सकते हैं, लेकिन यह सिर्फ एक छोटे से कम दखल होगा और यह अपवाद हैंडलिंग के साथ मुसीबतों पैदा करेगा। मैंने ActionFilters पढ़ा है, जिसका उपयोग मैं अपने लॉग को बनाने और बंद करने के लिए कर सकता था, लेकिन तब मेरे पास विधि के अंदर लॉग ऑब्जेक्ट तक पहुंचने का कोई तरीका नहीं होगा।

क्या आपके पास कोई सुझाव है? मैं कोड दोहराने से कैसे बच सकता हूं?

+0

संभावित डुप्लिकेट [MVC में प्रत्येक अनुरोध में एक विधि चलाएँ, सी #?] (Https://stackoverflow.com/questions/9511462/run-a-method-in-each-request-in-mvc -सी) – Liam

उत्तर

13

अन्य सुझाव काम नहीं करते हैं या यदि आप बस भी प्रवेश करने के बारे में पता है कि आप OnActionExecuting विधि ओवरराइड कर सकते हैं हो सकता है (अक्सर पुनः उपयोग के लिए एक आधार वर्ग में) के अलावा अन्य काम करने की आवश्यकता है।

// Custom controller. 
public class CustomController : Controller 
{ 
    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     // Do whatever here... 
    } 
} 

// Home controller. 
public class HomeController : CustomController 
{ 
    // Action methods here... 
} 
की
+0

धन्यवाद! यही वह है जिसकी तलाश में मैं हूं! – Simone

2

मैं आपको अपने नियंत्रक की निर्भरता के रूप में लॉगर (शायद ILogger) ऑब्जेक्ट में धक्का देने की सलाह दूंगा। आप एक डी कंटेनर (उदाहरण के लिए, एकता) द्वारा इस लॉगर ऑब्जेक्ट के जीवनकाल को नियंत्रित कर सकते हैं - और अगर आप सक्षम हैं तो अनुरोध के अनुसार आप अपने जीवनकाल को परिभाषित कर सकते हैं। इस दक्षिण के अन्य लाभ कि आपका कोड टेस्टेबल रहेगा।

+0

काफी अच्छा है, लेकिन मैं उन विधियों में लॉगिंग करने के बारे में कैसे जाउंगा जो नियंत्रक के सदस्य नहीं हैं? – Simone

+0

आप बस अपने लॉगर ऑब्जेक्ट को किसी भी अन्य तरीकों से पास कर सकते हैं ताकि वे इसका उपयोग भी कर सकें। वैकल्पिक रूप से यदि यह आपकी आवश्यकताओं के लिए बेहतर है तो आप अपने लॉगर को लागू कर सकते हैं (या बस अपने पहले से मौजूद लॉगर कार्यान्वयन को लपेटें) [परिवेश संदर्भ] (http://blogs.msdn.com/b/ploeh/archive/2007/07/23 /ambientcontext.aspx)। – aberkes

+0

मुझे परिवेश संदर्भ समाधान पसंद है (जबकि मैं लॉग इन को पास नहीं करूँगा, क्योंकि मैं अपनी विधि को क्रॉस-कटिंग चिंता के बारे में इतना नहीं जानना चाहता हूं)। हालांकि, थ्रेड सुरक्षा के बारे में क्या? मुझे खुली लॉग फाइलों को बंद करने की ज़रूरत है, इसलिए हर बार (अनुरोध के अंत में), मुझे लॉग बंद करना होगा। मेरे पास सिंगलटन (या अर्ध-सिंगलटन) नहीं हो सकता है, अन्यथा यह अनुरोधों में मौजूद होगा। एकाधिक लॉग एक ही फ़ाइल को खोलने की कोशिश करेंगे, विफल (और घटनाओं को खोना); एक एकल लॉग फ़ाइल बंद कर सकता है जबकि एक अन्य अनुरोधित कार्रवाई में अभी भी लॉग इन करने के लिए सामान है। – Simone

0

आप मॉड्यूल का उपयोग कर सकते हैं क्योंकि वे दोनों एक पाइपलाइन में बैठते हैं और अनुरोध के मूल निष्पादन के लिए पूर्व और पोस्ट प्रोसेसिंग प्रदान कर सकते हैं। BeginRequest/ActionExecuting और EndRequest/परिणाम निष्पादित। वे दोनों प्राधिकरण हुक भी प्रदान करते हैं।

http://msdn.microsoft.com/en-us/library/aa719858(v=vs.71).aspx

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