我只需要从控制器访问我的 BackgroundService 。 由于BackgroundServices注入了
services.AddSingleton<IHostedService, MyBackgroundService>()
如何在Controller类中使用它?
答案 0 :(得分:3)
这是我解决的方法:
Network Interface
然后在public interface IHostedServiceAccessor<T> where T : IHostedService
{
T Service { get; }
}
public class HostedServiceAccessor<T> : IHostedServiceAccessor<T>
where T : IHostedService
{
public HostedServiceAccessor(IEnumerable<IHostedService> hostedServices)
{
foreach (var service in hostedServices) {
if (service is T match) {
Service = match;
break;
}
}
}
public T Service { get; }
}
中输入
Startup
在我班上,需要访问后台服务...
services.AddTransient<IHostedServiceAccessor<MyBackgroundService>, HostedServiceAccessor<MyBackgroundService>>();
答案 1 :(得分:2)
最后,我在控制器中注入IEnumerable<IHostedService>
并按类型过滤:background.FirstOrDefault(w => w.GetType() == typeof(MyBackgroundService)
答案 2 :(得分:0)
在ConfigureServices函数中添加BackgroundService:
public void ConfigureServices(IServiceCollection services)
{
services.AddHostedService<ListenerService>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
注入控制器:
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
private readonly IHostedService listenerService;
public ValuesController(IHostedService listenerService)
{
this.listenerService = listenerService;
}
}
我使用BackgroundService为AWSSQS侦听器启动了多个侦听器。如果消费者想旋转新的侦听器,则可以通过将其发布到Controller方法(端点)来完成。