You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# .NET Core 6.0依赖注入下调用类方法的报错问题

解决C#中Users类自行创建HttpClient的参数缺失问题

你遇到的错误是因为修改后Users类的构造函数需要IHttpClientFactory参数,但你在创建Users实例时没有提供该参数。正确的做法是通过依赖注入(DI)让容器自动为Users类注入IHttpClientFactory,既不需要控制器传递参数,也能保留IHttpClientFactory避免套接字耗尽的优势。

具体修改步骤:

  1. 调整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();
        }
    }
    
  2. 将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();
    
  3. 控制器中注入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 11:22:07