2010-06-17 10 views
5

मैं सी # का उपयोग करके कुछ सरल निर्भरता इंजेक्शन के साथ शुरू करने की कोशिश कर रहा हूं और मैंने एक ऐसे मुद्दे के खिलाफ भाग लिया है जिसके लिए मुझे जवाब नहीं मिल रहा है।सी # निर्भरता इंजेक्शन - स्रोत के बिना निर्भरता को इंजेक्ट करने के लिए कैसे?

मेरे पास एक वर्ग है जो किसी अन्य विभाग द्वारा लिखा गया था जिसके लिए मेरे पास मेरे प्रोजेक्ट में स्रोत नहीं है। मैं इंटरफ़ेस का उपयोग करते हुए एक कन्स्ट्रक्टर हालांकि इस प्रकार की ऑब्जेक्ट इंजेक्ट करना चाहता था, लेकिन निश्चित रूप से, इंटरफ़ेस को इंटरफ़ेस को इंटरफ़ेस को कार्यान्वित करने के लिए इंटरफ़ेस को कार्यान्वित करने के लिए इंटरफ़ेस को कार्यान्वित करने के लिए इंटरफ़ेस को कार्यान्वित नहीं किया जा सकता।

मैंने इस तकनीक के बारे में कभी भी देखा है कि प्रत्येक अकादमिक उदाहरण में कक्षाएं कक्षाओं का उपयोग करती हैं जिन्हें परियोजना में घोषित किया जाता है। प्रोजेक्ट में उपलब्ध स्रोत के बिना मैं अपनी निर्भरता को इंजेक्शन देने के बारे में कैसे जाउंगा?

मुझे आशा है कि यह समझ में आता है, धन्यवाद।

उत्तर

0

यदि आपको कक्षा में कुछ भी बदलने की आवश्यकता नहीं है, तो आपको शायद ही कोड की आवश्यकता है। आइए मान लें कि आपके पास एक डीएलएल में एक कक्षा एक्स है जिसे आप लिख रहे हैं कि आप एक और कक्षा वाई इंजेक्षन करना चाहते हैं। ऐसे मामले में आप एक्स का एक उदाहरण बना सकते हैं और वाई के कन्स्ट्रक्टर में पैरामीटर के रूप में डाल सकते हैं। यह कुछ ऐसा दिखाई देगा:

आपकी परियोजना में कक्षा X वाले डीएलएल का संदर्भ जोड़ें।

Use NameSpaceOfX; 
Class Y 
{ 
    Public Y() //Default constructor 
    { 
    } 

    Public Y(X instanceOfX) 
    { 
     //Use instanceOfX here as required 
    } 
} 

आप मुख्य कोड:

//Create instance of X 
X instanceOfX = new X(); 
//Inject it into Y 
Y instanceOfY = new Y(instanceOfX); 
//Use Y now. 
6

आप अपने लक्ष्य प्रकार के चारों ओर एक आवरण बना सकते हैं तो उदाहरण के लिए, आप एक वर्ग हो सकता था कि वे प्रदान करते हैं:

public class TheirClass 
{ 
    public void DoSomething(); 
} 

जो के साथ आप एक इंटरफेस को परिभाषित कर सकते हैं:

public interface ITheirClass 
{ 
    void DoSomething(); 
} 

और एक आवरण वर्ग पर कि इंटरफ़ेस को लागू:

public class TheirClassWrapper : TheirClass, ITheirClass 
{ 

} 

या, यदि क्लास में उन्हें प्रदान की सील कर दिया जाता है, आप इसे कुछ अलग ढंग से करने की जरूरत है:

public class TheirClassWrapper : ITheirClass 
{ 
    private TheirClass instance = new TheirClass(); 

    public void DoSomething() 
    { 
    instance.DoSomething(); 
    } 
} 

तो फिर तुम कि इंटरफेस बजाय इंजेक्षन कर सकते हैं।

मुझे एमईएफ में पता है हम ठोस प्रकार निर्यात कर सकते हैं और उन्हें सही ढंग से इंजेक्शन दिया है, लेकिन मुझे अन्य आईओसी कंटेनरों के बारे में निश्चित नहीं है।

+0

यह था मैं वास्तव में क्या सोच रहा था। – Steven

+0

एडाप्टर पैटर्न। अच्छा निर्णय। – Wix

1

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

दो के पूर्व मान लिया जाये कि मैं दो विकल्प देख सकते हैं:

  1. उपयोग के बजाय विरासत। कक्षा के आधार पर यह संभव हो सकता है या नहीं भी हो सकता है, लेकिन आप इससे प्राप्त कर सकते हैं और पुराने के लिए अपनी नई कक्षा को प्रतिस्थापित कर सकते हैं।
  2. इंटरफ़ेस को लागू करने वाली विधियों/गुणों के साथ स्वयं इंटरफ़ेस बनाएं और बाहरी कंक्रीट क्लास को उस श्रेणी में लपेटें जो इंटरफ़ेस लागू करता है।

विकल्प 2 के लिए, यदि आप के वारिस नहीं कर सकते हैं, एक उदाहरण के रूप, यह मानते हुए कि आप केवल कक्षा में के बारे में एक विधि परवाह (हम इसे फोन करता हूँ Method1()) यदि आप एक मेल खाने वाली इंटरफ़ेस इसके लिए बनाने के लिए:

public interface IMyNewInterface 
{ 
    void Method1(); 
} 

तो है कि एक निर्भरता (सामान्य तौर पर अपने कंटेनर द्वारा इंजेक्शन) के रूप में ठोस वर्ग लेता है यह का कार्यान्वयन और सिर्फ ठोस वर्ग कॉल बनाने के लिए:

public class MyNewClass : IMyNewInterface 
{ 
    private MyConcreteClass _MyConcreteClass; 

    public void MyNewClass(MyConcreteClass concreteClass) 
    { 
     _MyConcreteClass = concreteClass; 
    } 

    public void Method1() 
    { 
     _MyConcreteClass.Method1(); 
    } 
} 
+0

लेकिन दो विकल्पों के उत्तरार्ध के साथ, इकाई को अपनी खुद की कक्षा का परीक्षण करना संभव होगा जो तीसरे पक्ष वर्ग का उपयोग कन्स्ट्रक्टर को दिए गए तर्क के रूप में करता है। यानी IClirassass –

+0

के साथ उनके क्लास को मॉक करना संभव होगा, दोनों विकल्प आपको अपने क्लास (जेनेरिक को अलग) को प्रतिस्थापित करने में सक्षम करते हैं, इंटरफ़ेस दृष्टिकोण हालांकि मेरी प्राथमिकता होगी। –

+0

क्षमा करें, मेरा मतलब 1 और 2 का मतलब नहीं था। ".. हम हमेशा निर्भर करते हैं ..." उद्धरण। शायद मैं गलत पढ़ता हूँ। शायद आप का मतलब था कि इसे करने के लिए सिर्फ यह नहीं किया जाना चाहिए। लेकिन अच्छे प्रथाओं का मतलब है कि हम भविष्य में बदलाव या रखरखाव के लिए रास्ता सुचारू बनाते हैं। अगर वर्ग इंजेक्शन दिया गया था तो यह इसे एओपी प्रदर्शन माप के साथ इंजेक्ट करना आसान बना देगा ?? –

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