C# .NET Core 6.0依赖注入下调用类方法的报错问题
解决C#中Users类自行创建HttpClient的参数缺失问题
你遇到的错误是因为修改后Users类的构造函数需要IHttpClientFactory参数,但你在创建Users实例时没有提供该参数。正确的做法是通过依赖注入(DI)让容器自动为Users类注入IHttpClientFactory,既不需要控制器传递参数,也能保留IHttpClientFactory避免套接字耗尽的优势。
具体修改步骤:
调整
Users类,通过构造函数注入IHttpClientFactory
让Users类直接从DI容器获取IHttpClientFactory,并在内部创建HttpClient:public class Users { private readonly HttpClient _httpClient; // 构造函数接收IHttpClientFactory,由DI自动注入 public Users(IHttpClientFactory httpClientFactory) { _httpClient = httpClientFactory.CreateClient(); } // 发起HTTP请求的业务方法示例 public async Task<string> FetchExternalUserDataAsync() { var response = await _httpClient.GetAsync("https://目标外部网站API地址"); response.EnsureSuccessStatusCode(); return await response.Content.ReadAsStringAsync(); } }将
Users类注册到依赖注入容器
在Program.cs中,除了配置AddHttpClient(),还需要把Users类加入服务注册:var builder = WebApplication.CreateBuilder(args); // 注册HttpClient工厂 builder.Services.AddHttpClient(); // 注册Users类,根据业务需求选择生命周期(Scoped/Transient/Singleton) builder.Services.AddScoped<Users>(); // 添加控制器服务 builder.Services.AddControllers(); var app = builder.Build(); // 中间件配置... app.MapControllers(); app.Run();控制器中注入
Users实例,无需手动创建
修改UsersController,通过构造函数注入Users实例,直接调用其方法即可:[ApiController] [Route("api/[controller]")] public class UsersController : ControllerBase { private readonly Users _usersService; // 注入Users实例 public UsersController(Users usersService) { _usersService = usersService; } [HttpGet] public async Task<IActionResult> GetUsers() { var externalData = await _usersService.FetchExternalUserDataAsync(); return Ok(externalData); } }
关键注意点:
- 绝对不要在
Users类中直接new HttpClient(),这会导致套接字资源无法高效回收,必须通过IHttpClientFactory创建客户端。 - 注册
Users类时,Scoped是Web应用中最常用的生命周期(每个请求创建一次实例),适配大多数业务场景。
内容的提问来源于stack exchange,提问作者Rodrigo K
相关产品推荐
相关产品推荐

