Turns out there’s an easy way to do this (thanks for the pointer, Steven).
If you need to be able to inject / get a reference to some service, go ahead and register the service normally (without worrying about any IHostedService
stuff):
services.AddSingleton<ServiceBusListener>();
Now we can register a separate hosted service whose only responsibility is to start/stop the service we just registered:
services.AddHostedService<BackgroundServiceStarter<ServiceBusListener>>();
Where BackgroundServiceStarter
is a helper class that looks something like:
public class BackgroundServiceStarter<T> : IHostedService where T:IHostedService
{
readonly T backgroundService;
public BackgroundServiceStarter(T backgroundService)
{
this.backgroundService = backgroundService;
}
public Task StartAsync(CancellationToken cancellationToken)
{
return backgroundService.StartAsync(cancellationToken);
}
public Task StopAsync(CancellationToken cancellationToken)
{
return backgroundService.StopAsync(cancellationToken);
}
}
Update 2018/8/6: updated code to avoid service locator pattern thanks to a suggestion from ygoe