我有一个情况,我需要在容器中注册类型实现者才能在BackgroundService中使用它们。
public abstract class ServiceRunner
{
public abstract Task RunAsync(CancellationToken token);
}
public class ServiceRunner<TService> : ServiceRunner
where TService : IService
{
ServiceRunner(/*ctor parameters*/)
{
...
}
//class logic implementation
public override async Task RunAsync(CancellationToken token)
{
...
}
}
所以我想获取 ServiceRunner 实现者,在容器中注册以在 BackgroundService 工作线程中运行它们。
public class Worker : BackgroundService
{
private readonly IServiceProvider _serviceProvider;
public ScpWorker(IServiceProvider provider)
{
_serviceProvider = provider;
}
protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
var services = _serviceProvider.GetServiceImplementors<ServiceRunner>(); //Have no idea how to implement this method
var tasks = services.Select(s => s.RunAsync(stoppingToken));
return Task.WhenAll(tasks);
}
}
关于如何实现这一目标有什么想法吗?
预先感谢您的帮助。
从我的角度来看,你可以获取容器中的所有对象
var allServiceRunners = _serviceProvider.GetServices<YourType>();
这样你就可以使用它们了