2012-12-04 31 views
8

a project नेट के लिए Common.Logging का उपयोग करता है, मैंने देखा कि कुछ वर्गों एक वर्ग स्थिर सदस्य के रूप में लकड़हारा उदाहरण घोषणा करते हैं। उदाहरण के लिए:सी # में मेरा सामान्य होना चाहिए। लॉगिंग लॉगर एक उदाहरण सदस्य या स्थैतिक होना चाहिए?

public class SimpleExample : IExample 
{ 
    public virtual void Run() 
    { 
     ILog log = LogManager.GetLogger(typeof (SimpleExample)); 

     log.Info("------- Initializing ----------------------"); 

     // etc 
    } 
}  

वहाँ एक दृष्टिकोण या अन्य पसंद करते हैं करने के लिए एक कारण है:

public class HelloJob : IJob 
{ 
    private static ILog _log = LogManager.GetLogger(typeof(HelloJob)); 

    public HelloJob() 
    { 
    } 

    public virtual void Execute(IJobExecutionContext context) 
    { 
     _log.Info(string.Format("Hello World! - {0}", System.DateTime.Now.ToString("r"))); 
    } 
} 

और अन्य वर्गों में लकड़हारा एक उदाहरण सदस्य के रूप में घोषित किया जाता है?

जो स्थितियों में प्रत्येक दृष्टिकोण की सिफारिश की है? क्या यह थ्रेड सुरक्षा से संबंधित है?

क्या यह एक समस्या होगी यदि मैंने अभी एक स्थिर "लॉगर" सदस्य के साथ "लॉगर" वर्ग घोषित किया है और पूरी परियोजना का उपयोग किया गया है (इस मुद्दे के अलावा कि मैं अभ्यास में एक वैश्विक चर है)?

उत्तर

9

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

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

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

public class HelloJob : IJob 
{ 
    private readonly ILog _log; 

    public HelloJob(ILog log) 
    { 
     _log = log; 
    } 
    ... 
} 

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

+0

'LogManager.GetLogger' शायद आंतरिक रूप से निर्भरता इंजेक्शन के माध्यम से कार्यान्वित किया गया है; अर्थात, निर्भरता लॉगर के भीतर प्रबंधित की जाती है। मैं नहीं चाहता कि मेरे लॉगर्स "प्रति-उदाहरण फ़ील्ड" के रूप में संग्रहीत हों और प्रत्येक इंस्टेंस के लिए उस ओवरहेड को प्राप्त करें। क्लासिक रूप से इसे संग्रहीत करना जब कक्षा पहली बार लोड हो जाती है मेरे लिए काम करता है। –

+2

@ChrisSinclair: यह सच है कि तत्काल * विवरण * LogManager.GetLogger द्वारा संभाला जाता है, और मुझे लगता है कि Commons.Logging एक सामान्य लॉगिंग इंटरफ़ेस प्रदान करता है, जिससे आप अंतर्निहित ढांचे, कॉन्फ़िगरेशन इत्यादि को स्विच करने के लिए स्वतंत्र होते हैं। हालांकि, यह एक है कारखाना पैटर्न का उदाहरण, निर्भरता इंजेक्शन नहीं। कारखाना पैटर्न में मैन्युअल तत्कालता पर बहुत सारे फायदे हैं, लेकिन निर्भरता इंजेक्शन में अभी भी अतिरिक्त फायदे हैं। आपके डी फ्रेमवर्क को अभी भी प्रत्येक प्रकार के लिए एक लॉगर का पुन: उपयोग करने के लिए सेट किया जा सकता है, और ओवरहेड व्यावहारिक रूप से 90% समय का अतुलनीय है। – StriplingWarrior

+0

आम। लॉगिंग दस्तावेज बताता है कि सार्वजनिक स्थैतिक LogManagers थ्रेड सुरक्षित हैं, लेकिन उदाहरण विधियां नहीं हैं, जो इस उत्तर का सामना करने लगती हैं। http://netcommon.sourceforge.net/docs/2.0.0/api/html/Common.Logging~Common.Logging.LogManager.html – coderjoe

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