यह बेहतर है इंटरफ़ेस घोषित करने के लिए:
interface ILogger
{
public void Log(string message);
}
तो लकड़हारा
class FileLogger : ILogger
{
public void Log(string message)
{
//Append to file
}
}
class EmptyLogger : ILogger
{
public void Log(string message)
{
//Do nothing
}
}
के विशिष्ट प्रकार को लागू करने और जहां आवश्यक इंजेक्षन। परीक्षण में आप EmptyLogger
इंजेक्ट करेंगे। सिंगलटन का उपयोग करना कठिन बना देगा, क्योंकि आपको परीक्षण में फ़ाइल में भी सहेजना होगा। यदि आप परीक्षण करना चाहते हैं कि कक्षा सही लॉग प्रविष्टियां बनाती है, तो आप नकली का उपयोग कर सकते हैं और अपेक्षाओं को परिभाषित कर सकते हैं।
इंजेक्शन के बारे में:
public class ClassThatUsesLogger
{
private ILogger Logger { get; set; }
public ClassThatUsesLogger(ILogger logger) { Logger = logger }
}
ClassThatUsesLogger उत्पादन कोड में FileLogger लेता है:
classThatUsesLogger = new ClassThatUsesLogger(new FileLogger());
परीक्षणों में यह EmptyLogger लेता है:
classThatUsesLogger = new ClassThatUsesLogger(new EmptyLogger());
आप विभिन्न परिदृश्यों में विभिन्न वालों इंजेक्षन। इंजेक्शन को संभालने के बेहतर तरीके हैं, लेकिन आपको कुछ पढ़ना होगा।
संपादित
याद रखें अगर आप अभी भी अपने कोड में सिंगलटन का उपयोग कर सकते के रूप में दूसरों का सुझाव दिया है, लेकिन आप एक वर्ग और प्रवेश के विशिष्ट कार्यान्वयन के बीच निर्भरता ढीला इंटरफ़ेस के पीछे इसके उपयोग को छिपाने चाहिए।
मैं इंजेक्षन हिस्सा समझ में नहीं आया। क्या आप विस्तार से बता सकते हैं? – Nemo
एक वर्ग जिसके लिए लॉगर की आवश्यकता होती है, लेकिन लॉगर नहीं बनाता है, एक वर्ग के निर्माण के दौरान पारित किया गया है (या आमतौर पर कन्स्ट्रक्टर के माध्यम से) को कक्षा में लॉगर * इंजेक्शन * के रूप में जाना जाता है। http://en.wikipedia.org/wiki/Dependency_injection –