2011-01-12 18 views
7

मैं स्ट्रक्चर मैप के लिए नया हूं और मेरे पास कुछ मौजूदा कोड है जो मैं स्ट्रक्चर मैप 2.5.4 का उपयोग कर रहा हूं।संरचना मैप और इंजेक्शनिंग आईनेमेरेबल <T>

एक वर्ग है जो स्ट्रक्चर मैप का उपयोग करके बनाया गया है जिसमें एक निर्माता है जो पैरामीटर के रूप में IEnumerable<ICar> लेता है।

रजिस्ट्री में निम्न कोड है।

Scan(x => 
{ 
    x.TheCallingAssembly(); 
    x.WithDefaultConventions(); 
    x.AddAllTypesOf<ICar>(); 
    } 
); 

ForRequestedType<IEnumerable<ICar>>().TheDefault.Is.ConstructedBy(
      x => ObjectFactory.GetAllInstances<ICar>()); 

मैं एक इकाई परीक्षण लिख रहा हूँ और ObjectFactory बंद एक नेस्टेड कंटेनर प्राप्त किया है और एक उदाहरण के इंजेक्शन है इंजेक्षन पद्धति का उपयोग करके। आईकर के उदाहरणों में से एक को अपने कन्स्ट्रक्टर में इंजेक्शन प्रकार प्राप्त करना चाहिए। हालांकि यह काम नहीं कर रहा था और मैंने ऑब्जेक्ट फैक्ट्री को नीचे ट्रैक किया। GETAllInstances() कॉल जो मेरे नेस्टेड कंटेनर का उपयोग नहीं करता है।

मैं इसे काम करने के लिए कैसे प्राप्त कर सकता हूं?

मैंने स्ट्रक्चर मैप ऑटोवॉयरिंग एरे और आईनेमरेबल इंस्टेंस के बारे में भी पढ़ा लेकिन मैं इसे काम नहीं कर सका।

क्या उपर्युक्त रजिस्ट्री कोड को फिर से लिखने का एक बेहतर तरीका है ताकि IEnumerable<ICar> का एक उदाहरण बनाया जा सके और मेरे नेस्टेड कंटेनर से इंजेक्शन प्रकार का उपयोग किया जा सके?

+0

कुछ स्थानों पर आप 'टीकर' और अन्य जिन्हें आप 'आईकर' का उपयोग करते हैं, का उपयोग करते हैं। उनका रिश्ता क्या है (और संरचना मैप उनके संबंध के बारे में जानता है)? –

+0

क्षमा करें, वे वही बात हैं .. टाइपो। – GiddyUpHorsey

उत्तर

7

यदि आप एक नेस्टेड कंटेनर में एक उदाहरण इंजेक्शन दे रहे हैं, तो आपको उस उदाहरण को नेस्टेड कंटेनर से पुनर्प्राप्त करने की आवश्यकता होगी। स्थैतिक ऑब्जेक्ट फैक्ट्री का अपना कंटेनर होता है, संभवतः आपके मामले में 'पैरेंट' कंटेनर। पैरेंट कंटेनर नेस्टेड कंटेनरों से उदाहरणों का उत्तराधिकारी नहीं होता है।

आप उदाहरणों एक वर्ग है जो अपने निर्माता में एक IEnumerable स्वीकार करता है में इंजेक्शन के सभी के लिए किसी भी विशिष्ट पंजीकरण करने की ज़रूरत नहीं है। स्ट्रक्चर मैप स्वचालित रूप से ऐसा करेगा। यदि आपके कंटेनर में पंजीकृत आईसीआर के 3 उदाहरण हैं, और उस कंटेनर से फू के उदाहरण का अनुरोध करें, जहां फू के पास IEnumerable<ICar> कन्स्ट्रक्टर पैरामीटर है, तो फ़ू को इंकार इंजेक्शन के 3 उदाहरणों के साथ बनाया जाएगा।

+0

हां, मुझे लगा कि ऑब्जेक्ट फैक्ट्री का अपना कंटेनर है और इसलिए इंजेक्शन प्रकार 'ऑब्जेक्ट फैक्ट्री। गेटअलस्टेंस ()' कॉल पर दिखाई नहीं दे रहा था, मुझे बस यह जानने की जरूरत है कि कोड की उस पंक्ति को फिर से लिखना है ताकि इंजेक्शन प्रकार दृश्यमान है। – GiddyUpHorsey

+0

मैंने 'ForRequestedType >() को हटाया। TheDefault.Is.ConstructedBy (x => ObjectFactory.GetAllInstances ());' रेखा लेकिन मुझे निम्न अपवाद मिलता है: 'संरचना मैप अपवाद कोड: 202 कोई डिफ़ॉल्ट इंस्टेंस परिभाषित नहीं है प्लगइनफैमिली आईनेमेरेबल 'के लिए। आपने जो कहा, उससे मैंने सोचा कि 'x.AddAllTypesOf ();' लाइन आईकर के सभी उदाहरण पंजीकृत करेगी और अनुरोध किया गया प्रकार के निर्माता को IENumerable पैरामीटर प्रदान किया जाएगा। कोई विचार क्यों वह सही काम नहीं कर रहा है? – GiddyUpHorsey

+0

ठीक है, मुझे यह काम मिल गया। मुझे स्ट्रक्चर मैप के नवीनतम संस्करण का उपयोग करने के लिए प्रोजेक्ट को अपडेट करना पड़ा। संस्करण 2.5.4 आपके द्वारा वर्णित तरीके से व्यवहार नहीं करता है, लेकिन 2.6.1 करता है। मैंने 'ForRequestedType >() को हटा दिया। TheDefault.Is.ConstructedBy (x => ObjectFactory.GetAllInstances ()); 'लाइन और मेरे नेस्टेड कंटेनर से इंजेक्शन उदाहरण प्राप्त करने में सक्षम था। – GiddyUpHorsey

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