2012-03-15 27 views
6

नीचे करने का सही तरीका क्या है ताकि ParentClassMyClass पर निर्भर न हो?लूप में निर्भरता इंजेक्शन

public class ParentClass 
{ 
    public void MyFunction(IList<Foo> foos) 
    { 
     foreach (var bar in foos) 
     { 
      var myClass = new MyClass(); 
      myClass.DoStuff(); 
     } 
    } 
} 

आम तौर पर एक पाश के बिना मैं तो बस उस में इंजेक्षन था ParentClass निर्माता के साथ, लेकिन यहाँ मैं पाश से प्रत्येक यात्रा के लिए यह का एक नया उदाहरण की जरूरत है।

या शायद मैं जो हासिल करने की कोशिश कर रहा हूं, उसे करने के लिए एक बेहतर तरीका है? शायद MyClass प्रत्येक पुनरावृत्ति के अंत में खुद को रीसेट कर सकता है ताकि मैं इसका पुन: उपयोग कर सकूं?

+0

फिर ऑब्जेक्ट संग्रह को परिभाषित क्यों न करें, या केवल DoStuff को स्थैतिक के रूप में परिभाषित करें क्योंकि आप नया उदाहरण बनाते हैं और तुरंत –

उत्तर

7

आप एक फैक्ट्री ऑब्जेक्ट इंजेक्ट कर सकते हैं जो MyClass उदाहरण ParentClass में बनाता है।

प्रत्येक लूप पुनरावृत्ति के लिए, आप फैक्ट्री ऑब्जेक्ट को कॉल करते हैं, इसलिए यह आपको MyClass का एक नया उदाहरण देता है।

+1

ऑब्जेक्ट की निर्भरता के दौरान आप कारखाने के अंदर ऑब्जेक्ट कैसे बनाते हैं? इस मामले में, हमें कारखाने में कंटेनर खुद को इंजेक्ट करना होगा। मैं यहां दो चेतावनी देखता हूं - कंटेनर इंजेक्शन और कंटेनर का उपयोग कर। रिसोल्व (सर्विस लोकेटर)। क्या यह अनुशंसित है? कोई अन्य दृष्टिकोण? – hungryMind

+0

यह एक अच्छा सवाल है, @ हंगरीमाइंड, मुझे लगता है कि आपको इसे एसओ में वास्तविक प्रश्न के रूप में प्रचारित करना चाहिए और इसे इस से लिंक करना चाहिए। वैसे भी, मुझे यह आलेख मिला है जो कुछ विकल्प प्रदान करता है: http://blog.ploeh.dk/2012/03/15/ImplementinganAbstractFactory/ – Fabio

1

आप निर्माता में Func<IMyClass> इंजेक्ट कर सकते हैं, फिर इसे कई बार कॉल करें क्योंकि आप अलग-अलग उदाहरण प्राप्त करना चाहते हैं।

आईओसी फ्रेमवर्क जैसे ऑटोफैक इस मूल रूप से समर्थन करता है।

+0

मैं आपके साथ सहमत हूं। हालांकि, मैं सुझाव देता हूं कि जब तक यह आवश्यक न हो जाए तब तक किसी भी आईओसी कंटेनर का उपयोग न करें: डीटीएसटीटीसीपीडब्ल्यू (सरलतम सोच करें जो संभवतः काम कर सकता है) – Skyp

+0

@ स्काइप 'सरल' उद्देश्य या लक्ष्यों के बिना एक अस्पष्ट अवधारणा है। यदि इकाई परीक्षण एक लक्ष्य है, तो आईओसी का उपयोग करना सबसे सरल चीजों में से एक है जो संभव काम कर सकता है। –

0

यह वास्तव में इस बात पर निर्भर करता है कि आप MyClass के साथ क्या करना चाहते हैं। जैसा कि यह खड़ा है, foo's, bar's और MyClass के बीच कोई सहसंबंध नहीं है। मान लीजिए कि आप या तो MyClass के सीटीआर में बार इंजेक्ट करना चाहते हैं, या इसे DoStuff के पैरामीटर के रूप में पास करना चाहते हैं, तो मैं केवल फैक्ट्री क्लास या विधि को पेरेंट क्लास सीटर में इंजेक्ट करता हूं और माइक्रैस के नए-नए इंजेक्शन के स्थान पर इसका उपयोग करता हूं।

0

आपका प्रस्तावित इंजेक्शन पठनीय, समझने योग्य और शुद्धता के लिए सत्यापित करने में आसान है।

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

चूंकि reset() समाधान प्रत्येक कोड परिवर्तन पर सत्यापित करने के लिए अधिक समय और एकाग्रता लेता है, इसलिए मैं वास्तव में यह मापने की सलाह देता हूं कि परेशान होने से पहले यह एक बाधा है।

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