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

如何将StructureMap配置迁移至ASP.NET Core 6 Web API内置依赖注入?

从StructureMap迁移到.NET 6依赖注入:IBookingApiClient注册方案

你需要用工厂委托来注册IBookingApiClient,通过IServiceProvider在运行时解析所需依赖,而不是在注册阶段直接实例化——因为.NET 6的DI容器在注册阶段还未完成所有服务的构建,直接实例化会导致依赖无法获取。

正确的配置代码如下:

builder.Services.AddHttpClient("BookingApi", client =>
{
    client.BaseAddress = new Uri(settingsReader.GetRequiredSettingValue("BookingApiClientUrl"));
});

// 先确保ICorrelationIdReader已注册(如果还没加的话)
// builder.Services.AddTransient<ICorrelationIdReader, YourCorrelationIdReaderImplementation>();

builder.Services.AddTransient<IBookingApiClient>(serviceProvider =>
{
    // 通过IHttpClientFactory获取命名为"BookingApi"的HttpClient
    var bookingHttpClient = serviceProvider.GetRequiredService<IHttpClientFactory>().CreateClient("BookingApi");
    // 从容器获取ICorrelationIdReader实例
    var correlationIdReader = serviceProvider.GetRequiredService<ICorrelationIdReader>();
    
    return new BookingApiClient(new CorrelationHttpClient(bookingHttpClient, correlationIdReader));
});

关键说明:

  • 用Func<IServiceProvider, IBookingApiClient>作为注册委托,容器会在服务被请求时才执行这个委托,此时所有依赖都已准备好
  • 命名HttpClient必须通过IHttpClientFactory创建,这是.NET Core/6中管理命名HttpClient的标准方式,不能直接通过serviceProvider.GetService<HttpClient>获取
  • IServiceProvider是DI容器的入口,可通过它获取任何已注册的服务实例

内容的提问来源于stack exchange,提问作者Andrew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 08:07:19