如何将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
相关产品推荐
相关产品推荐

