我有启动和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
构建的。当发生这种情况时—IServiceProvider
从IServiceCollection
复制服务。因此,当您的托管服务启动时-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;
}
希望有帮助