У меня есть Startup и IHosterService, ведь я хочу добавить службу в IServiceCollection. Проблема в том, что после того, как я добавлю свою службу в IServiceCollection, я не могу получить ее от IServiceProvider.
Я попытался добавить свой сервис в IServiceColection в IHostedService, но после того, как я добавил свой сервис, я не могу получить его от IServiceProvider. Есть ли у меня возможность добавить услугу в IHostedService, а затем получить новую услугу от IServiceProvider?
Запускать
public class Startup {
...
public void ConfigureServices(IServiceCollection services) {
services.AddHostedService<InitHostedService>();
//without this line I can't resolve IServiceCollection in InitHostedService
services.AddSingleton<IServiceCollection>(services);
}
InitHostedService
public class InitHostedService : IHostedService {
private readonly IServiceCollection _services;
private readonly IServiceProvider _serviceProvider;
public InitHostedService(IServiceCollection services, IServiceProvider serviceProvider) {
_services = services;
_serviceProvider = serviceProvider;
}
public async Task StartAsync(CancellationToken cancellationToken) {
var serviceUri = // get actual uri for my service
if (serviceUri != null) {
// add service with uri to IServiceCollaction
_services.AddServiceClient<IIdMapperServiceClient, IdMapperServiceClient>(serviceUri);
// can't get here my added service
var a = _serviceProvider.GetRequiredService<IIdMapperServiceClient>();
}
...
}
Расширение AddServiceClient
public static void AddServiceClient<TServiceContract, TImplementation>(
this IServiceCollection services,
Uri serviceUri)
where TServiceContract : class
where TImplementation : class, TServiceContract {
services.AddHttpClient<TServiceContract, TImplementation>((sp, client) => { client.BaseAddress = serviceUri; });
}
Что ты пытаешься сделать? Почему бы вам не вызвать AddServiceClient в вашем методе ConfigureServices? . Размещенные службы — это длительные фоновые задания, а не способ регистрации или инициализации других служб. Ваш размещенный сервис должен исключать только IIdMapperServiceClient в своем конструкторе. Среда выполнения должна предоставить один
Вы пытаетесь получить URL-адрес службы из конфигурации? Вы можете сделать это в своем AddHttpClient. Параметр IServiceProvider можно использовать для получения экземпляра IConfiguration или любого другого зарегистрированного объекта конфигурации.
Наконец, 7 месяцев назад .NET 5 достиг конца жизни. .NET 5 была «текущей» версией с годовой поддержкой. Сейчас он полностью не поддерживается. Самая старая поддерживаемая версия .NET Core — .NET 6. Это версия с долгосрочной поддержкой, поддерживаемая до 2024 года.





Я думаю, вы пытаетесь сделать что-то подобное.
public static class ServiceCollectionExtension
{
public static IServiceCollection RegisterServices(this IServiceCollection servicesCollection, IConfiguration configuration)
{
servicesCollection.AddControllers();
servicesCollection.AddEndpointsApiExplorer();
servicesCollection.AppServices();
servicesCollection.AddIdentity();
servicesCollection.AddSwagger();
servicesCollection.AddAutoMapper(typeof(Program));
servicesCollection.AddDatabase(configuration);
var appSettings = servicesCollection.GetApplicationSettings(configuration);
servicesCollection.AddJwtTokenAtuhentication(appSettings);
return servicesCollection;
}
Надеюсь, поможет
Вы не можете сделать это таким образом. IServiceProvider строится из IServiceCollection в процессе запуска. Когда это происходит - IServiceProvider копирует услуги из IServiceCollection. Итак, когда ваш размещенный сервис запускается — IServiceProvider уже был создан с помощью сервисов, которые вы добавили во время запуска. Добавление дополнительных сервисов в IServiceCollection после этого не даст никакого эффекта, потому что IServiceProvider уже "отсоединен" от этой коллекции.
Нам нужно увидеть код, в котором вы пытаетесь зарегистрировать тип и где вы пытаетесь разрешить объект (получить фактический объект).