2015-01-16 10 views
7

के साथ कस्टम निर्भरता रिज़ॉल्वर का उपयोग करते समय त्रुटियां मैं निम्नलिखित वर्ग का उपयोग निर्भरता रिज़ॉल्वर के रूप में कर रहा हूं। मार्ग विन्यास के बाद से http://www.asp.net/web-api/overview/advanced/dependency-injectionयूनिटी और वेब एपीआई नियंत्रक

public class UnityWebAPIResolver : IDependencyResolver 
    { 
    protected IUnityContainer container; 

    public UnityWebAPIResolver(IUnityContainer container) 
    { 
     if (container == null) 
     { 
      throw new ArgumentNullException("container"); 
     } 
     this.container = container; 
    } 

    public object GetService(Type serviceType) 
    { 
     try 
     { 
      return container.Resolve(serviceType); **// This line throws error** 
     } 
     catch (ResolutionFailedException) 
     { 
      return null; 
     } 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     try 
     { 
      return container.ResolveAll(serviceType); **// This line throws error** 
     } 
     catch (ResolutionFailedException) 
     { 
      return new List<object>(); 
     } 
    } 

    public IDependencyScope BeginScope() 
    { 
     var child = container.CreateChildContainer(); 
     return new UnityWebAPIResolver(child); 
    } 

    public void Dispose() 
    { 
     container.Dispose(); 
    } 
} 

WebApiConfig कक्षा में संदर्भ समझे मैं इस

config.DependencyResolver = new UnityWebAPIResolver(UnityConfig.GetContainer()); 

समस्या की तरह निर्भरता समाधानकर्ता को विन्यस्त कर रहा हूँ मैं इस तरह कई त्रुटियाँ हो रही है ..

InvalidOperationException - The type IHostBufferPolicySelector does not have an accessible constructor. 
InvalidOperationException - The type ModelMetadataProvider does not have an accessible constructor. 
InvalidOperationException - The type ITraceManager does not have an accessible constructor. 
InvalidOperationException - The type ITraceWriter does not have an accessible constructor. 
InvalidOperationException - The type IHttpControllerSelector does not have an accessible constructor. 
InvalidOperationException - The type IAssembliesResolver does not have an accessible constructor. 
InvalidOperationException - The type IHttpControllerTypeResolver does not have an accessible constructor. 
InvalidOperationException - The type IHttpActionSelector does not have an accessible constructor. 
InvalidOperationException - The type IActionValueBinder does not have an accessible constructor. 
InvalidOperationException - The type IContentNegotiator does not have an accessible constructor. 
InvalidOperationException - The type IHttpControllerActivator does not have an accessible constructor. 
InvalidOperationException - The type IBodyModelValidator does not have an accessible constructor. 

यहां तक ​​कि अगर मैं अपने ग्लोबल में ऐसा कुछ करने की कोशिश करता हूं। मैक्स मुझे एक ही त्रुटि मिल रही है।

GlobalConfiguration.Configuration.DependencyResolver = new UnityWebAPIResolver(UnityConfig.GetContainer()); 

प्रश्न: मेरी एपीआई नियंत्रक में सभी निर्भरता ठीक से इंजेक्ट किया जा करने के लिए, अपने ही चिंता का विषय है, क्योंकि यह ऊपर उल्लेख किया (विशिष्ट ढांचे) प्रकार, के कई समाधान नहीं कर सकता है लगता है कि किसी भी मौका है कि यह पूरे ढांचे को खराब कर सकता है और यादृच्छिक त्रुटियों को उत्पन्न कर सकता है?

+0

आपको किसी भी समय कस्टम प्रकारों को मैप करना होगा, यह आपके लिए जादुई रूप से नहीं किया गया है। क्या आपके पास ऐसा 'यूनिटी.कॉन्फिग' ऐसा है? – Haney

+0

हां मेरे सभी कस्टम प्रकार मैप किए गए हैं और यह मेरे कस्टम प्रकारों पर कोई त्रुटि नहीं फेंक रहा है ... यह केवल एमवीसी फ्रेमवर्क प्रकारों के लिए त्रुटियों को फेंकता है जो मेरे कंटेनर में पंजीकृत नहीं हैं .. – ATHER

+0

आह हाँ, मुझे यह समस्या वापस आई थी दिन भी मैंने इसे ठीक किया लेकिन मुझे पता लगाने के लिए मुझे अपना स्रोत कोड देखना होगा। मुझे कुछ घंटे दें और मैं एक उत्तर पोस्ट करूंगा। :) – Haney

उत्तर

14

कोई समस्या नहीं है और आपका प्रोग्राम यहां अपेक्षित काम करता है। जो आप देखते हैं वह यूनिटी की Resolve विधि द्वारा फेंकने वाले पहले मौके अपवाद हैं। अपवाद फेंक दिया गया है क्योंकि एक सेवा को हल नहीं किया जा सकता है जब एकता null वापस नहीं आती है। IDependencyResolver.GetService कार्यान्वयन हालांकि हमेशा null वापस आना चाहिए यदि अनुरोधित सेवा निर्भरता समाधान कार्यान्वयन में पंजीकृत नहीं है।

यदि GetServicenull लौटाता है, तो एमवीसी अनुरोधित सेवा के लिए ढांचे के डिफ़ॉल्ट कार्यान्वयन पर वापस आ जाएगा। ज्यादातर मामलों में यूनिटी कंटेनर में उन सेवाओं को ओवरराइड करने की आवश्यकता नहीं होती है, और यहां तक ​​कि जब एक अलग सेवा की आवश्यकता होती है, तब भी आप आसानी से यूनिटी कॉन्फ़िगरेशन में जोड़े बिना एमवीसी डिफ़ॉल्ट कार्यान्वयन को प्रतिस्थापित कर सकते हैं।

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

जाहिर है कि एप्लिकेशन को शुरू करने के बाद कई बार उन तरीकों से डीबगर बंद करना बहुत परेशान है, इसलिए समाधान इन तरीकों में रोकने से डीबगर को रोकने के लिए [DebuggerStepThrough] विशेषता के साथ उन तरीकों को चिह्नित करना है।

+0

धन्यवाद स्टीवन, इस तरह के एक विस्तृत उत्तर के लिए। मुझे वह पसंद है :) – ATHER

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