2011-11-08 19 views
5

मेरे पास सी # में कक्षा पुस्तकालय है और यह मेरे लिए कई अलग-अलग कार्य करता है। मैं पूरे वर्ग में लॉग इन करने में सक्षम होना चाहता हूं, हालांकि, मैं वास्तव में लॉगिंग लाइब्रेरी के उदाहरणों को पारित नहीं करना चाहता हूं।संदर्भ के बिना कक्षा कक्षा पुस्तकालय में प्रवेश

उदा।

public void MyMethod(LoggingClass logger) 
{ 
    logger.log("something"); 
} 

public void MyMehtod2(LoggingClass logger) 
{ 
    logger.log("something else"); 
} 

मुझे इस पुस्तकालय में हर जगह कक्षाएं मिली हैं और ऐसा करने के लिए एक अच्छे तरीके से संघर्ष कर रहा हूं। मैं निनजेक्ट के साथ निर्भरता इंजेक्शन देख रहा हूं, लेकिन ऐसा लगता है कि यह कैसे काम करना चाहिए इसके आसपास मेरा सिर नहीं लग रहा है।

तो संक्षेप में, मैं एक लॉगिंग क्लास प्राप्त करने में सक्षम होना चाहता हूं, और इसे एक बार फिर से चालू करने में सक्षम होना चाहता हूं, फिर इसे लॉग इन करने के लिए हर जगह उपयोग करें।

उत्तर

5

मुझे सिंगलटन की आवश्यकता नहीं दिखाई देती है। बस अपनी लायब्रेरी में एक स्थिर वर्ग का उपयोग करें:

internal static class Logger { 

static Logger() { 

    // configure logger 

} 

internal static void Log(string Message, params object[] args) { 

    var message = string.Format(Message, args); 
    // write message 

} 
+1

नोट: 'लॉग' के लिए हस्ताक्षर में दूसरा पैरामीटर एक टाइपो है। कीवर्ड 'param' की बजाय 'पैराम्स' है और पूरी लाइन को पढ़ना चाहिए: 'आंतरिक स्थिर शून्य लॉग (स्ट्रिंग संदेश, पैराम्स ऑब्जेक्ट [] args) {' –

+0

धन्यवाद @ डेविड टैनसी: निश्चित – IAbstract

+0

@IAbstract मैं एक आम साझा कैसे करूं कक्षा पुस्तकालय और कक्षा पुस्तकालय को कॉल करने वाले कोड के बीच लॉग इन करें? – Howiecamp

0

आप अपने लॉगर के लिए singleton का उपयोग कर सकते हैं और इसे कहीं भी पर कॉल कर सकते हैं।

+1

मुझे लगता है कि सिंगलटन खराब रूप है और इस मामले में उचित नहीं है। – IAbstract

+0

मुझे लगता है कि आप उसे समझा सकते हैं। – CodeCaster

+0

एकल समाधान किसी भी समाधान के लिए पहला विचार नहीं होना चाहिए। यदि आप पहले सोचते हैं * "सिंगलटन यहां काम कर सकता है" *, आपको बस एक स्थिर वर्ग का उपयोग करना चाहिए। यदि, हालांकि, आप यह निर्धारित करते हैं कि स्थैतिक वर्ग को राज्य की आवश्यकता होती है, या कुछ इंटरफ़ेस को लागू करना आवश्यक है, ** ** ** सिंगलटन पर विचार करें। अक्सर, स्थैतिक कक्षाएं पर्याप्त होंगी। – IAbstract

1

मेरी प्राथमिकता विस्तार तरीकों कि कुछ स्थिर वर्ग को लागू के रूप में @IAbstract ने उल्लेख किया जाएगा। अपनी कक्षाओं सभी अपने स्वयं के Ilog इंटरफ़ेस को लागू यदि आप यह कुछ इस तरह कर सकता है:

public static void Log(this ILog source, string message) 
{ 
    source.Log(message, null); 
} 

public static void Log(this ILog source, string message, param object[] args) 
{ 
    // Assuming a static class as mentioned by @IAbstract 
    Logger.Log(message, args); 
} 
अपनी कक्षाओं में या जहां सुरक्षा के स्तर पर निर्भर करता है आप this.Log(message) या बाह्य myClass.Log(message) उपयोग करने में सक्षम हो जाएगा से

तो। इसे सार्वजनिक होने की आवश्यकता नहीं होगी, लेकिन यह पुस्तकालय की जरूरतों पर निर्भर करेगा।

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