【问题标题】:How to configure HttpClient via Unity container?如何通过 Unity 容器配置 HttpClient?
【发布时间】:2018-08-10 03:29:14
【问题描述】:

我正在尝试使用统一容器注册 HttpClient 对象的实例,以便可以在整个应用程序中使用它,但遇到错误 - “类型 HttpMessageHandler 没有可访问的构造函数。”

这是我用来向 Unity 注册 HttpClient 的代码-

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

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

        return container;
    }

【问题讨论】:

  • 显然 Unity 尝试使用 HttpClient(HttpMessageHandler)HttpClient(HttpMessageHandler, Boolean) 构造函数创建 HttpClientHttpMessageHandler 是一个抽象类,所以不能创建它的实例。

标签: c# .net unity-container asp.net-web-api


【解决方案1】:

您可以使用工厂方法来注册它:

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

【讨论】:

  • 这很好用,小错误是 BaseAddress 采用 Url 而不是字符串
【解决方案2】:

默认情况下,Unity 使用参数最多的构造函数。在您的情况下,那将是HttpClient(HttpMessageHandler, Boolean)。您需要明确指定无参数的默认 ctor。

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

【讨论】:

  • 很高兴知道,它确实有效。我们如何使用这种 InjectionProperty/InjectionConstructor 配置风格添加 DefaultRequestHeaders?使用 InjectionFactory 是可行的。
  • @RubberDuckDuck 如果您愿意,可以添加多个InjectionProoperties。您也可以向InjectionConstructor 添加参数。您必须以正确的顺序添加构造函数采用的所有参数。如果您希望容器解析其中一些参数,您可以将参数 Type 添加为某种通配符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-08
  • 2019-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
相关资源
最近更新 更多