将服务添加到ConfigureServices中的IServiceCollection NOT中 &



我有启动和IHosterService在女巫我想添加一个服务到IServiceCollection。问题是,在我将服务添加到IServiceCollection后,我无法从IServiceProvider

获取它我试图将我的服务添加到IHostedService中的iservicecollection,但在我添加了我的服务后,我无法从IServiceProvider获得它。我是否有机会在ihostdservice中添加服务,然后从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; });
}

你不能这样做。IServiceProvider是在启动过程中由IServiceCollection构建的。当发生这种情况时—IServiceProviderIServiceCollection复制服务。因此,当您的托管服务启动时-IServiceProvider已经构建了您在启动期间添加的服务。在此之后向IServiceCollection添加更多的服务将没有效果,因为IServiceProvider是"分离的"。

我认为你是在尝试那样做。

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;
}

希望有帮助

相关内容

  • 没有找到相关文章

最新更新