2013-02-04 24 views
5

मैं एकता कंटेनर के साथ HttpClient ऑब्जेक्ट का एक उदाहरण पंजीकृत करने का प्रयास कर रहा हूं ताकि इसे पूरे ऐप में उपयोग किया जा सके, लेकिन त्रुटि में चल रहा हो - "टाइप HttpMessageHandler के पास एक सुलभ कन्स्ट्रक्टर नहीं है।"एकता कंटेनर के माध्यम से HttpClient को कॉन्फ़िगर कैसे करें?

यहाँ कोड मैं Unity-

private static IUnityContainer BuildUnityContainer() 
    { 
     var container = new UnityContainer(); 

     container.RegisterType<HttpClient>(
      new InjectionProperty("BaseAddress", new Uri(ConfigurationManager.AppSettings["ApiUrl"]))); 

     return container; 
    } 
+0

जाहिर एकता बनाने की कोशिश 'HttpClient' का उपयोग कर' HttpClient (HttpMessageHandler) 'या' HttpClient (HttpMessageHandler, बूलियन) ' निर्माता। 'HttpMessageHandler' एक सार वर्ग है, इसलिए यह इसका उदाहरण नहीं बना सकता है। – dtb

उत्तर

4

आप के बजाय यह रजिस्टर करने के लिए कारखाना विधि का उपयोग कर सकते हैं:

container.RegisterType<HttpClient>(
    new InjectionFactory(x => 
     new HttpClient { BaseAddress = ConfigurationManager.AppSettings["ApiUrl"] } 
    ) 
); 
+0

यह बहुत अच्छा काम करता है, मामूली गलती यह है कि बेस एड्रेस स्ट्रिंग के बजाय यूआरएल में ले जाता है – camelCaseWarrior

9

डिफ़ॉल्ट रूप से एकता सबसे पैरामीटर के साथ निर्माता का उपयोग करता है के साथ HttpClient रजिस्टर करने के लिए इस्तेमाल करते हैं। यह आपके मामले में HttpClient(HttpMessageHandler, Boolean) होगा। आपको पैरामीटर रहित डिफ़ॉल्ट ctor को स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता है।

container.RegisterType<HttpClient>(new InjectionProperty(...), new InjectionConstructor()); 
+0

जानना अच्छा है, और यह काम किया। हम इस इंजेक्शनप्रॉपर्टी/इंजेक्शन कॉन्फ़िगरर शैली को कॉन्फ़िगर करने के साथ डिफ़ॉल्टRequestHeaders कैसे जोड़ देंगे? इंजेक्शन फैक्ट्री के साथ यह सक्षम था। – camelCaseWarrior

+0

@RubberDuckDuck यदि आप चाहते हैं तो आप एकाधिक 'इंजेक्शनप्रोपर्टीज' जोड़ सकते हैं। और आप 'इंजेक्शन कॉन्स्ट्रक्टर' के पैरामीटर भी जोड़ सकते हैं। आपको कन्स्ट्रक्टर को सही क्रम में ले जाने वाले सभी पैरामीटर जोड़ना होगा। यदि आप कंटेनर को उन कुछ पैरामीटर को हल करना चाहते हैं तो आप कुछ प्रकार के वाइल्डकार्ड के रूप में पैरामीटर 'टाइप' जोड़ सकते हैं। –