У меня есть контроллер, которому нужен сервис, поэтому я внедряю его.Службе нужен HttpClient
, поэтому я добавляю ее.Им обоим нужен контекст EF.
Я добавляю HttpClient
при запуске службы.Однако у меня есть ошибка ниже.
В Startup
:
services.AddHttpClient<IMyService, MyService>();
В MyService
класс
private readonly HttpClient _httpClient;
private readonly ReadContext _readContext;
public MyService(HttpClient httpClient, ReadContext readContext)
{
_httpClient = httpClient;
_readContext = readContext;
}
В моем контроллере:
private readonly IMyService _myService;
public MyController(ReadContext ctx, IMyService myService)
{
_ctx = ctx;
_myService = myService;
}
Ошибка:
System.InvalidOperationException: Cannot resolve scoped service 'MyApp.Backend.ReadContext' from root provider.
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(Type serviceType, IServiceScope scope, IServiceScope rootScope)
at Microsoft.Extensions.DependencyInjection.ServiceProvider.Microsoft.Extensions.DependencyInjection.ServiceLookup.IServiceProviderEngineCallback.OnResolve(Type serviceType, IServiceScope scope)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType)
at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired)
at lambda_method(Closure , IServiceProvider , Object[] )
at Microsoft.Extensions.Http.DefaultTypedHttpClientFactory`1.CreateClient(HttpClient httpClient)
Не то, что когда служба внедряется в контроллер, который не требует ReadContext
, это работает.Кажется, здесь есть некоторый цикл разрешения.
ОБНОВЛЕНИЕ
Из комментариев я понимаю, что AddHttpClient<T>
создает экземпляр T
с тем же временем жизни, что и созданный и управляемый HttpClient
ядром aspnet, которое длиннее, чем время жизни DbContext
, которое является временем жизни фактического запроса.Справедливо.Тогда как мне внедрить HttpClient
во временную службу?
UPDATE2
В соответствии с этим blog Я могу внедрить экземпляр IHttpClientFactory
в MyService
вместо этого используйте services.AddHttpClient();
.На самом деле ошибка исчезает.Мне нужно немного почитать, чтобы понять разницу между запросом у фабрики экземпляра HttpClient
или инъекцией.