2010-10-25 26 views
9

का उपयोग करते समय इष्टतम रणनीति मैंने अपने ऐप में लॉग 4नेट एकीकृत किया है। लॉगिंग लॉग इन करने में सहायता करने के लिए मेरे पास कुछ सहायक तरीके हैं जो लॉग लॉगनेट कहते हैं। रिफैक्टरिंग करते समय, मैं इन विधियों को बेस क्लास में ले जाने की योजना बना रहा हूं ताकि कोड अन्य व्युत्पन्न कक्षाओं में दोहराया न जाए।लॉग 4नेट - विरासत

विरासत मॉडल के बिना, प्रत्येक वर्ग

private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 

आधार वर्ग में ऊपर रखने आधार वर्ग के रूप में घोषित करने प्रकार वापस आ जाएगी में सही ढंग से काम किया निम्न और वर्ग प्राप्त नहीं।

इस घोषणा को बेस क्लास में स्थानांतरित करने का सबसे अच्छा तरीका क्या है?

वर्तमान में, मैं इसे प्राप्त करने के कुछ तरीकों के बारे में सोच सकता हूं लेकिन उन्हें इष्टतम नहीं ढूंढ सकता।

उत्तर

10

मुझे लगता है कि मैं यह कर जाएगा:

LogManager.GetLogger(this.GetType()); 
+0

धन्यवाद स्टीफन। तो क्या मुझे "लॉग" गैर स्थैतिक बनाने की आवश्यकता होगी? – byte

+0

या बेस क्लास कन्स्ट्रक्टर में कुछ लिखें जैसे (बेस क्लास.लॉग == नल) {बेसक्लास.लोग = लॉगमैनेजर.गेटलॉगर (यह। गेट टाइप()); } // मानते हुए लॉग अभी भी बेस क्लास – byte

+0

में निजी स्थिर है यह स्थैतिक नहीं हो सकता है क्योंकि आपको प्रति व्युत्पन्न कक्षा में एक उदाहरण की आवश्यकता है। –

3

Sefan के जवाब के आधार पर यहाँ है मैं यह कैसे आधार वर्ग

/// <summary> 
    /// This is delay loaded to allow us to capture the class type of the inherited class on request 
    /// </summary> 
    private ILog log = null; 

    protected ILog Log 
    { 
     get 
     { 
      if (log == null) 
      { 
       log = LogManager.GetLogger(this.GetType()); 
      } 

      return log; 
     } 
    } 
0

हम सिर्फ प्रत्येक वर्ग है कि एक लकड़हारा की जरूरत में यह redeclare में घोषित (इसका बिंदु निजी स्थिर है) और log<tab><tab> टाइपिंग के रूप में सरल बनाने के लिए कोड स्निपेट का उपयोग करें, यदि आप अतिरिक्त फैंसी प्राप्त करना चाहते हैं, तो आप कुछ ऐसा कर सकते हैं:

public class Loggable<T> where T : Loggable<T> 
{ 
    private static readonly ILog log = LogManager.GetLogger(typeof(T)); 

    protected static ILog Log 
    { 
     get 
     { 
      return log; 
     } 
    } 
} 

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

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