2008-09-24 9 views
11

में किसी कन्स्ट्रक्टर को तर्क कैसे पास करें IOC-Framework में किसी कन्स्ट्रक्टर को तर्क कैसे दे सकता है? (आईओसी-ढांचे नास्तिक होने की कोशिश कर रहा है;))आईओसी-फ्रेमवर्क

object objectToLogFor = xxx; 
container.Resolve<ILogging>(objectToLogFor); 

public class MyLogging : ILogging 
{ 
    public MyLogging(object objectToLogFor){} 
} 

ऐसा लगता है कि इस StructureMap में संभव नहीं है: मैं की तरह कुछ करना चाहते हैं। लेकिन मुझे किसी को गलत साबित करना अच्छा लगेगा।

क्या अन्य ढांचे अधिक सुविधा युक्त हैं? या क्या मैं गलत तरीके से आईओसी-फ्रेमवर्क का उपयोग कर रहा हूं?

+1

किसी कैसे एकता के साथ ऐसा करना पता है? – mhamrah

उत्तर

9

साथ ParameterResolution की जाँच संरचना नक्शे में आप प्राप्त कर सकते थे इस का उपयोग करते हुए विधि के साथ:

string objectToLogFor = "PolicyName"; 
ObjectFactory.With<string>(objectToLogFor).GetInstance<ILogging>(); 

देखें: http://codebetter.com/blogs/jeremy.miller/archive/2008/09/25/using-structuremap-2-5-to-inject-your-entity-objects-into-services.aspx

+1

प्रतिक्रिया के लिए धन्यवाद। – Ruben

+1

यह उत्तर –

0

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

+0

एसएम इस अनुमति देता है, इसलिए नीचे वोट – Schneider

4

यह भाषा-अज्ञेयवादी कैसे हो सकता है? यह प्रश्न में ढांचे के कार्यान्वयन विस्तार है।

वसंत आपको मूल्यों/संदर्भों की सूची के रूप में c'tor args निर्दिष्ट करने के लिए अनुमति देता है, यदि यह आपकी बात है। संपत्ति इंजेक्शन की तुलना में, यह बहुत पठनीय नहीं है।

कुछ लोग इसके बारे में कॉलर के नीचे गर्म हो जाते हैं, और आग्रह करते हैं कि जावा इंजेक्शन जावा में एकमात्र थ्रेड-सुरक्षित दृष्टिकोण है। तकनीकी रूप से वे सही हैं, लेकिन व्यवहार में यह कोई फर्क नहीं पड़ता।

3

यह एक बहुत ही आम आवश्यकता नहीं होनी चाहिए, लेकिन कभी-कभी यह वैध है। Ninject, जो स्ट्रक्चर मैप से हल्का है, आपको संदर्भ से क्षणिक वस्तुओं को पुनर्प्राप्त करते समय पैरामीटर पास करने की अनुमति देता है। Spring.NET भी।

अधिकांश समय, आईओसी कंटेनर में घोषित ऑब्जेक्ट्स क्षणिक नहीं होते हैं, और दूसरों को गैर-क्षणिक वस्तुओं को रचनाकारों/गुणों/विधियों के माध्यम से निर्भरताओं के रूप में स्वीकार करते हैं।

हालांकि, यदि आप वास्तव में एक कारखाने के रूप में कंटेनर का उपयोग नहीं करना चाहते हैं, और यदि आपके पास उन वस्तुओं पर पर्याप्त नियंत्रण है जिन्हें आप हल करना चाहते हैं, तो आप संपत्ति या विधि इंजेक्शन का उपयोग कर सकते हैं भले ही यह कम प्राकृतिक और अधिक जोखिम भरा लगता है किसी तरह।

0

अन्य आईओसी ढांचे अधिक सुविधा समृद्ध हैं।

आईई। Autofac

+0

फिर मुझे इसे अपनी जानकारी के रूप में वोट देना होगा। एसएम समर्थन करता है कि उपयोगकर्ता क्या पूछ रहा है ताकि पोस्टर प्रश्न हल करने के लिए कुछ और "फीचर समृद्ध" प्रासंगिक नहीं है। – Schneider

0

तुम भी ऐसा कर सकते हैं विंडसर आसानी से

5

साथ कैसल के लिए विंडसर:

var foo = "foo"; 
var service = this.container.Resolve<TContract>(new { constructorArg1 = foo }); 

नोट कन्स्ट्रक्टर तर्क निर्दिष्ट करने के लिए किसी अज्ञात ऑब्जेक्ट का उपयोग। StructureMap का उपयोग कर

:

var foo = "foo"; 
var service = container.With(foo).GetInstance<TContract>(); 
+0

होना चाहिए था TContract क्या है? मैं इसे डीएनएन v5 में भी जगह पर देखता हूं। सी # में इसके बराबर क्या है? धन्यवाद। – Picflight

+0

TContract आपके द्वारा निर्दिष्ट सामान्य प्रकार है, जेनेरिक एक सी # सुविधा है। Http://msdn.microsoft.com/en-us/library/ms379564(VS.80).aspx देखें –