AddHttpClient<TClient>与AddHttpClient<TClient,TImplementation>的区别及适用场景
关于AddHttpClient两个重载的使用场景
先明确两个重载的核心区别:
AddHttpClient<TClient>:直接把TClient类型注册为DI服务,同时为它绑定专属的HttpClient实例AddHttpClient<TClient, TImplementation>:注册**接口/抽象类(TClient)与具体实现类(TImplementation)**的映射关系,同时为这个实现类绑定专属的HttpClient实例
什么时候用AddHttpClient<TClient>?
- 你的
TClient本身就是可直接实例化的具体类,不需要抽象接口。比如你写了个WeatherApiClient类,构造函数接收HttpClient,没有对应的接口,直接用这个重载把它注册到DI容器,同时自动配置好配套的HttpClient。 - 示例代码:
// 直接注册具体类WeatherApiClient services.AddHttpClient<WeatherApiClient>(); // 后续可直接注入该具体类 public class MyService { public MyService(WeatherApiClient client) { ... } }
什么时候用AddHttpClient<TClient, TImplementation>?
- 你遵循面向接口编程,给客户端类定义了抽象接口,需要把接口和实现类绑定到DI容器。比如你有
IWeatherApiClient接口,WeatherApiClient是它的实现,且实现类依赖HttpClient,用这个重载可以一步完成接口-实现的注册,以及HttpClient的绑定。 - 示例代码:
// 注册接口与实现的映射,同时绑定HttpClient services.AddHttpClient<IWeatherApiClient, WeatherApiClient>(); // 后续注入接口类型 public class MyService { public MyService(IWeatherApiClient client) { ... } }
额外补充:不管用哪个重载,都可以链式调用ConfigureHttpClient来配置HttpClient的基础地址、超时等参数,比如:
services.AddHttpClient<WeatherApiClient>() .ConfigureHttpClient(c => { c.BaseAddress = new Uri("https://api.weatherapi.com/"); c.Timeout = TimeSpan.FromSeconds(10); });
内容的提问来源于stack exchange,提问作者daniil_
相关产品推荐
相关产品推荐

