2012-07-30 13 views
7

मैं निर्मातागुजर हिस्सा

Foo(IColor c , int someNumber) 

है और मैं केवल रन टाइम के दौरान कुछ नंबर पता है, और मैं के दौरान इस निर्माता कॉल करना चाहते हैं को हल करने और someNumber मूल्य पारित करने के लिए और IColor को स्वैच्छिक रूप से हल किया जाना है।

कुछ इस तरह:

container.Resolve<IFoo>(someNumber); 

किया जाना यह संभव है?

उत्तर

7

हां, अज्ञात प्रकार के उदाहरण में कन्स्ट्रक्टर तर्क पास करें; आपको लगता है कि गुमनाम प्रकार का समर्थन नहीं करता (या यहां तक ​​कि अगर तुम नहीं कर रहे हैं) सी # के एक पुराने संस्करण का उपयोग कर रहे हैं, तो

IColor desiredColor = //whatever 
int desiredNumber = //whatever else 
IFoo foo = container.Resolve<IFoo>(new { c = desiredColor, somenumber = desiredArgumentValue }); 

, आप एक शब्दकोश के साथ भी ऐसा कर सकते हैं: संपत्ति के नाम निर्माता पैरामीटर नाम से मेल खाना चाहिए :

IColor desiredColor = //whatever 
int desiredNumber = //whatever 
Dictionary<string, object> arguments = new Dictionary<string, object>(); 
arguments.Add("c", desiredColor); 
arguments.Add("somenumber", desiredNumber); 
IFoo foo = container.Resolve<IFoo>(arguments); 
+0

आईसीओलर पैरामीटर के बारे में क्या? – Darragh

+0

@Darragh मैंने एक संबंधित तर्क शामिल करने के लिए उत्तर संपादित किया है। – phoog

17

आपको सेवा लोकेटर जैसे कंटेनर का उपयोग करने के बजाय टाइपेड फैक्ट्री पसंद करनी चाहिए। बस कारखाने इंटरफेस को परिभाषित:

public interface IFooFactory { 
    IFoo Create(int somenumber); 
} 

और टाइप कारखाने के रूप में यह रजिस्टर:

var foo = fooFactory.Create(desiredArgumentValue); 

अधिक जानकारी read Windsor documentation

के लिए:

container.Register(Component.For<IFooFactory>().AsFactory()); 

तब कारखाने इंजेक्षन और इसका इस्तेमाल करने निर्भरता इंजेक्शन का उपयोग

+0

अच्छा जवाब। क्या इसका मतलब यह है कि अगर मैं इस कारखाने का उपयोग करता हूं, तो मुझे हमेशा इसका उपयोग करने के बाद वस्तु को छोड़ना याद रखना होगा? दस्तावेज़ कहता है "याद रखें कि डिफ़ॉल्ट रूप से विंडसर में सभी घटक सिंगलेट हैं और डिफ़ॉल्ट रिलीज पॉलिसी कंटेनर का उपयोग करके सभी घटकों, यहां तक ​​कि क्षणिक लोगों के संदर्भ में रहता है। यही कारण है कि टाइप किए गए फैक्ट्री के माध्यम से घटकों को रिलीज़ करना महत्वपूर्ण है। घटक सुविधा के माध्यम से हल किया गया। " –

+0

हां, यह सबसे अच्छा अभ्यास है। आप इस उद्देश्य के लिए फैक्ट्री इंटरफ़ेस पर 'शून्य नष्ट (IFoo घटक) विधि को परिभाषित कर सकते हैं, या अपने घटक में' आईडीस्पोजेबल 'लागू कर सकते हैं और इसका निपटान कर सकते हैं। फिर इसे जारी किया जाएगा। –

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