2013-02-04 8 views
5

Ich versuche, eine Instanz des HttpClient-Objekts mit dem Unity-Container zu registrieren, so dass es in der gesamten App verwendet werden kann, aber in den Fehler - "Der Typ HttpMessageHandler hat keinen barrierefreien Konstruktor."Wie konfiguriert man HttpClient über den Unity-Container?

Hier ist der Code Ich verwende die Httpclient mit Unity-

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

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

     return container; 
    } 
+0

Offenbar versucht die Einheit der 'HttpClient' mit der' Httpclient (HttpMessageHandler) 'oder' Httpclient (HttpMessageHandler, Boolean) 'zu erstellen Konstrukteur. 'HttpMessageHandler' ist eine abstrakte Klasse, daher kann keine Instanz davon erstellt werden. – dtb

Antwort

4

Sie können die Factory-Methode verwenden, um sie zu registrieren, statt:

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

Dies funktioniert gut, ein kleiner Fehler ist, dass BaseAddress Url anstelle von String übernimmt – camelCaseWarrior

9

standardmäßig Unity verwendet den Konstruktor mit den meisten Parameter zu registrieren. Das wäre HttpClient(HttpMessageHandler, Boolean) in Ihrem Fall. Sie müssen den parameterlosen Standard-Ctor explizit angeben.

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

Gut zu wissen, und es hat funktioniert. Wie würden wir DefaultRequestHeaders mit diesem InjectionProperty/InjectionConstructor-Konfigurationsstil hinzufügen? Mit InjectionFactory war es machbar. – camelCaseWarrior

+0

@RubberDuckDuck Sie können mehrere 'InjectionProperties' hinzufügen, wenn Sie möchten. Und Sie können dem 'InjectionConstructor' auch Parameter hinzufügen. Sie müssen alle Parameter, die der Konstruktor annimmt, in der richtigen Reihenfolge hinzufügen. Wenn der Container einige dieser Parameter auflösen soll, können Sie den Parameter 'Type' als eine Art Platzhalter hinzufügen. –

Verwandte Themen