2013-05-28 9 views
9

मेरे स्ट्रक्चर मैप बूटस्ट्रैपिंग कोड में मैं असेंबली स्कैन करने के लिए एक कस्टम सम्मेलन का उपयोग कर रहा हूं और ऑब्जेक्ट ग्राफ़ में नामित उदाहरणों के रूप में इंटरफ़ेस/कार्यान्वयन जोड़े जोड़ता हूं।संरचना मैप में नामांकित उदाहरण और एक डिफ़ॉल्ट उदाहरण?

registry.For(interfaceType).Use(type) 
    .Named(implementationName); 

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

registry.For(interfaceType).Add(type); 

या:

मैं धाराप्रवाह एपीआई के विभिन्न संयोजनों, सहित कोशिश की है

registry.For(interfaceType).Use(type); 

यहां तक ​​कि लोगों के रूप में पदावनत चिह्नित हैं। लेकिन परिणामस्वरूप व्यवहार हमेशा होता है कि अंतिम एक डिफ़ॉल्ट है। तो अगर जोड़ने कार्यान्वयन के क्रम कुछ इस तरह है:

  1. लॉगर इंटरफेस के लिए log4net कार्यान्वयन
  2. लॉगर इंटरफेस के लिए नाम "log4net" का उपयोग डिफ़ॉल्ट
  3. द्वारा log4net कार्यान्वयन का उपयोग लॉगर इंटरफेस के लिए "मॉक" नामक मॉक कार्यान्वयन का उपयोग करें

परिणामी व्यवहार यह है कि "नकली" कार्यान्वयन का उपयोग डिफ़ॉल्ट रूप में नहीं किया जाता है जब कोई नाम निर्दिष्ट नहीं होता है। कंटेनर में AllInstances में डीबगिंग, मैं इस क्रम में देखें:

  1. नाम "log4net" log4net लकड़हारा का एक उदाहरण
  2. एक नाम के लिए एक GUID के साथ log4net लकड़हारा का एक उदाहरण (किसी अन्य डिफ़ॉल्ट की तरह उदाहरण के लिए, जहाँ तक मैं बता सकता हूँ)
  3. नाम "नकली" एक प्रवेश बयान जब एक उदाहरण के नाम के बिना कंटेनर से कहा जाता है, हालांकि, नकली कार्यान्वयन में परिणामों में

डिबगिंग नकली लकड़हारा का एक उदाहरण उपयोग किया जा रहा है।

क्या ऑब्जेक्ट ग्राफ़ में डिफ़ॉल्ट उदाहरण जोड़ने का कोई तरीका है जबकि अभी भी नामित उदाहरणों को जोड़ने में सक्षम है?

उत्तर

20

Add विधि उदाहरण जोड़ देगा (यदि आपको नामों को जोड़ना होगा या संग्रह/गणनाओं के साथ उपयोग करने के लिए कई उदाहरण जोड़ना होगा)। यदि कोई स्पष्ट डिफ़ॉल्ट पंजीकृत नहीं है (Use विधि का उपयोग करके), अंतिम उदाहरण जोड़ा गया डिफ़ॉल्ट उदाहरण बन जाएगा। Use विधि डिफ़ॉल्ट उदाहरण सेट करने के लिए है। यदि आप कई बार Use का आह्वान करते हैं, तो पंजीकृत अंतिम उदाहरण डिफ़ॉल्ट हो जाएगा।

एक डिफ़ॉल्ट उदाहरण सेट और फिर रजिस्टर करने के लिए आगे नामित उदाहरणों आप इस तरह यह करने के लिए सक्षम होना चाहिए आदेश में:

registry.For(typeof(Logger)).Use(typeof(Log4Net)).Named("Log4Net"); 
registry.For(typeof(Logger)).Add(typeof(Mock)).Named("Mock"); 

यह Log4Net उदाहरण डिफ़ॉल्ट और एक नामित उदाहरण के रूप में भी पहुंचा जा सकता है। Mock उदाहरण नामित उदाहरण के रूप में उपलब्ध होगा।

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