2011-01-30 14 views
15

के लिए इंजेक्शन उदाहरण का उपयोग करने के लिए संरचना मैप संभव नहीं है मुझे अपने परीक्षणों के लिए structmap में एक उदाहरण इंजेक्शन देने में समस्या है।स्ट्रक्चर इंजेक्शन

मेरे वस्तुओं ग्राफ इस

internal class ConfigurationManager : IConfigurationManager : IManager 
{ 
    public ISomeManager SomeManager { get; set; } 
} 

internal class SomeManager : ISomeManager : IManager 
{ 
    public IConfigurationManager ConfigurationManager { get; set; } 
} 

1) पहले मैं कंटेनर बनाने और सभी पाया रजिस्ट्रियों जोड़ने

_container = new Container(c => c.Scan(s => 
{ 
    s.TheCallingAssembly(); 
    s.LookForRegistries(); 
})); 

इन स्कैन किया विधानसभाओं में से एक निम्नलिखित पंजीकरण होता है की तरह लग रहा

x.For<IConfigurationManager>().Singleton.Use<ConfigurationManager>(); 

2) तो मैं इस प्रबंधकों

_configurationManagerStub = MockRepository.GenerateStub<IConfigurationManager>(); 
_container.Inject(_configurationManagerStub); 

3) तो प्रबंधक उदाहरणों के लिए कॉन्फ़िगर सेटर इंजेक्शन के बिना बनाई गई हैं के लिए एक विशेष नकली वस्तु सुई (परिपत्र निर्भरता से बचने के लिए)

foreach (Type pluginType in AllManagers()) 
{ 
    managerInstances.Add(_container.GetInstance(pluginType)); 
} 

चाहते 4) आखिर में मैं इमेजगर प्रकार की गुण सेट करने के लिए BuildUp विधि का उपयोग करता हूं।

_container.Configure(x => x.SetAllProperties(c => 
{ 
    // configure the property injection for all managers 
    c.Matching(prop => typeof(IManager).IsAssignableFrom(prop.PropertyType)); 
})); 

// push in dependencies -> EXCEPTION 
managerInstances.ForEach(x => _container.BuildUp(x)); 

दुर्भाग्य से कोड की अंतिम पंक्ति में मुझे निम्नलिखित अपवाद मिलता है।

StructureMap.StructureMapException: StructureMap अपवाद कोड: IConfigurationManagerProxyd079980359cf491b821a3afb15be8a86, DynamicProxyGenAssembly2 के लिए एक InstanceBuilder बनाने के प्रयास में 245 त्रुटि, संस्करण = 0.0.0.0, संस्कृति = तटस्थ, PublicKeyToken = अशक्त ----> सिस्टम .ArgumentException: प्रकार 'System.Object' की अभिव्यक्ति प्रकार विधि की 'System.String' के पैरामीटर के लिए नहीं किया जा सकता 'Castle.Core.Interceptor.IInterceptor [] GetIInterceptor []'

जब मैंने इंस्टेंस इंजेक्ट किया था तो structmap एक इंस्टेंसबिल्डर का उपयोग करने का प्रयास क्यों करता है?

बीआर, डेविड

+0

क्या आपने इस समस्या को हल किया है? मेरे पास एक ही अपवाद है। – AdamSane

उत्तर

1

मुद्दा कैसल DynamicProxy की StructureMap समर्थन के साथ है (राइनो मजाक उड़ाता है और Moq का उपयोग करता है यह) स्टब्स उत्पन्न होती है जब निर्माण में इस्तेमाल किया।

विशेष रूप से कैसल अनुरोधित प्रॉक्सी प्रकार के लिए 2 पैरामीटर के साथ एक कन्स्ट्रक्टर उत्पन्न करता है और उन पैरामीटर के नाम नहीं हैं। स्ट्रक्चर मैप के भीतर कंस्ट्रक्टर फंक्शन बिल्डर इस तरह के मामले में उचित लैम्ब्डा अभिव्यक्ति बनाने में विफल रहता है (शून्य को सिस्टम के रूप में माना जाता है। ऑब्जेक्ट जहां सिस्टम.स्ट्रिंग की अपेक्षा की जाती है)। जब आप केवल संपत्ति सेटर्स सेट अप करना चाहते हैं, तब भी इसकी आवश्यकता नहीं होती है, लेकिन इसे नियंत्रित करने का कोई तरीका नहीं है।

"इंजेक्ट" गैर-गतिशील रूप से जेनरेट किए गए स्टब्स के साथ काम करेगा, लेकिन आप एक अलग समाधान की तलाश कर सकते हैं।

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