एमईएफ के संदर्भ में पूरी तरह से सोचने के बजाय, अपने वर्ग के डिजाइन को व्यापक रूप से देखें। आम तौर पर जब आप एक वर्ग को डिजाइन कर रहे हैं, आप संबद्ध गुण का एक सेट है, इन सेवाओं हो सकता है, जैसे,
public class MyService
{
public ILogger Logger { get; set; }
public void SaySomething()
{
Logger.Log("Something");
}
}
अब, मैं आगे जाना है और इस बात का एक उदाहरण बना सकते हैं:
var service = new MyService();
और अब, अगर मैं कोशिश करते हैं और विधि का उपयोग करें:
service.SaySomething();
मैं स्पष्ट रूप से मैं अपने Logger
संपत्ति आरंभ करने के लिए है कि पता नहीं है:
var service = new MyService() { Logger = new ConsoleLogger() };
(या):
var service = new MyService();
service.Logger = new ConsoleLogger();
तो त्रुटि क्रम जब तक स्पष्ट नहीं हो जाएगा।हम वर्ग को फिर से परिभाषित करना हो तो: अब
public class MyService
{
private readonly ILogger _logger;
public MyService(ILogger logger)
{
if (logger == null) throw new ArgumentNullException("logger");
_logger = logger;
}
public void SaySomething()
{
_logger.Log("Something");
}
}
, अगर आप कोशिश करते हैं और MyService
का एक उदाहरण बनाने के लिए, आप स्पष्ट रूप से के लिए वस्तु को सही ढंग से initialised जा करने के लिए इस अतिरिक्त सेवा (ILogger
) प्रदान करने के लिए है। इस तरीके का एक संख्या में मदद करता है:
- आप निर्भरता अपने प्रकार की आवश्यकता है व्यक्त करते हैं, और यह एक initialisation अनुबंध है कि प्रकार एक प्रयोग करने योग्य राज्य में बनाई गई है सुनिश्चित करने के लिए संतुष्ट होना चाहिए रूपों।
- सेवाएं सुनिश्चित करने के द्वारा आप रनटाइम त्रुटियों का जोखिम कम कर देते हैं।
संकलन समय पर स्थिर जांच करने के लिए आप कोड अनुबंध (जैसा कि @ जेरेडपार द्वारा उल्लिखित) का उपयोग करके इस डिजाइन पर अधिक सुधार कर सकते हैं।
MEF के संदर्भ में, आप ([ImportingConstructor]
) [Import]
बजाय [ImportingConstructor]
MEF के रूप में उपयोग करके अपवाद फेंक जब यह एक प्रकार पर सभी आयातों को संतुष्ट नहीं कर सकते हैं के साथ भाग प्राप्त कर सकते हैं, और केवल प्रकार वापस आ जाएगी दोनों initialisation के बाद और फिर [Import]
रों।
कन्स्ट्रक्टर इंजेक्शन आम तौर पर बेहतर होता है।
+1 # 1 अब इतना स्पष्ट प्रतीत होता है। मैं कोड अनुबंध मुद्दे से अनजान था। क्या आप # 3 थोड़ा और समझा सकते हैं? – ILovePaperTowels
@ILovePaperTowels # 3 के संबंध में, मेरे अनुभव में अधिकांश समय आप 'आयात ['] करते हैं, यह एक फ़ील्ड के लिए है जो एक बार सेट कभी नहीं बदलेगा। सी # में यह क्षेत्र को 'रीडोनली' बनाकर व्यक्त किया जाता है लेकिन यह '[आयात] 'मामले में काम नहीं करता है क्योंकि कन्स्ट्रक्टर खत्म होने के बाद फ़ील्ड असाइन की जाती है जो' readonly' का उल्लंघन है। यह वास्तव में (और स्काई) प्रतिबिंब के माध्यम से काम करेगा लेकिन गैर-एमईएफ संरचना के साथ इसका उपयोग लगभग असंभव – JaredPar