निर्भरता इंजेक्शन का उपयोग करते समय आप निर्भरताओं को इंजेक्ट करते हैं?मुझे किस निर्भरता को इंजेक्ट करना चाहिए?
मैं पहले सभी निर्भरता इंजेक्शन है, लेकिन जब TDD कर पाया है वहाँ आम तौर पर निर्भरता के दो प्रकार हैं:
- उन जो वास्तविक बाहरी निर्भरता जो जैसे बदल सकते हैं कर रहे हैं ProductRepository
- जो पूरी तरह से टेस्टेबिलिटी के लिए मौजूद हैं उदा। वर्ग के व्यवहार है कि निकाला गया है और सिर्फ testability के लिए
एक दृष्टिकोण इंजेक्शन का एक हिस्सा इस
public ClassWithExternalDependency(IExternalDependency external,
IExtractedForTestabilityDependency internal)
{
// assign dependencies ...
}
की तरह सभी निर्भरता इंजेक्षन करने के लिए है, लेकिन मैं मिल गया है इस में निर्भरता ब्लोट पैदा कर सकता है डी रजिस्ट्री।
एक और दृष्टिकोण इस
public ClassWithExternalDependency(IExternalDependency external)
: this (external, new ConcreteClassOfInternalDependency())
{}
internal ClassWithExternalDependency(IExternalDependency external,
IExtractedForTestabilityDependency internal)
{
// assign dependencies ...
}
यह और अधिक प्रयास है, लेकिन एक बहुत अधिक समझ बनाने के लिए लगता है "testability निर्भरता" को छिपाने के लिए है। डाउनसाइड सभी ऑब्जेक्ट्स को डी फ्रेमवर्क में कॉन्फ़िगर नहीं किया गया है, जिससे मैंने सुना है कि "सर्वोत्तम अभ्यास" तोड़ रहा है।
आप किस दृष्टिकोण का समर्थन करेंगे और क्यों?
निर्भरताओं को बदलने के लाभों में से एक अलगाव में इकाइयों का परीक्षण करने में सक्षम होना है। मैं अलगाव में इसका परीक्षण करने के लिए कैलकुलेटर कक्षा निकाल सकता हूं लेकिन शायद इसे इंजेक्शन की आवश्यकता नहीं है (दूसरा कोड उदाहरण देखें)। मैं इसे सीटू में परीक्षण नहीं कर सका क्योंकि यह कैलकुलेटर वर्ग के क्लाइंट के लिए परीक्षणों को फहराएगा। – Alex
सभी इंजेक्टेबल इंजेक्ट करें, सभी नए नए। इस भेद के बिना, DI को कार्यक्रम की पूरी अवधि के लिए रहने वाली सभी वस्तुओं की आवश्यकता होगी। न्यूबेल, उर्फ वैल्यू टाइप, निष्क्रिय डेटा का प्रतिनिधित्व करते हैं और वैकल्पिक रूप से कुछ संबंधित परिवर्तनीय व्यवहार (यानी वे मान जो मान लेते हैं और नए मान वापस करते हैं)। इंजेक्टेबल्स, उर्फ सेवा/व्यावसायिक प्रकार, कार्यक्षमता का प्रतिनिधित्व करते हैं और वैकल्पिक रूप से कुछ संबंधित प्रोग्राम स्थिति का प्रतिनिधित्व करते हैं। तर्कसंगत रूप से, हमारे पास बाह्य राज्य का प्रतिनिधित्व करने के लिए I/O प्रकार भी हैं, उदा। फ़ाइल()। I/O प्रकारों को नया होना चाहिए लेकिन सार कारखानों के माध्यम से बनाया जाना चाहिए ताकि उन्हें परीक्षण के लिए मजाक किया जा सके। – Jegschemesch