从asp.net core 2.1中的控制器访问BackgroundService

时间:2018-03-28 13:06:12

标签: c# asp.net-core asp.net-core-2.1 background-service

我只需要从控制器访问我的 BackgroundService 。 由于BackgroundServices注入了

services.AddSingleton<IHostedService, MyBackgroundService>()

如何在Controller类中使用它?

3 个答案:

答案 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方法(端点)来完成。