В ASP.NET Core 2.0 есть способ добавить фоновые задачи путем реализации интерфейса IHostedService
(см. Https://docs.microsoft.com/en-us/aspnet/core/fundamentals/hosted-services?view=aspnetcore- 2.0). Следуя этому руководству, я смог заставить его работать, зарегистрировав его в контейнере ASP.NET Core. Моя цель - читать сообщения из очереди и обрабатывать задания в фоновом режиме; сообщение отправляется в очередь (через действие контроллера), а затем обрабатывается в фоновом режиме через определенный интервал времени.
// Not registered in SimpleInjector
services.AddSingleton<IHostedService, MyTimedService>();
Когда я помещаю эту регистрацию в контейнер ASP.NET Core, она автоматически запускает процесс при запуске приложения. Однако, когда я регистрирую это в SimpleInjector, сервис не запускается автоматически. Я полагаю, что это так, потому что мы регистрируем контейнер SimpleInjector только с MvcControllers и MvcViewComponents:
// Wire up simple injector to the MVC components
container.RegisterMvcControllers(app);
container.RegisterMvcViewComponents(app);
Проблема, с которой я сталкиваюсь, заключается в том, что я хочу начать внедрение компонентов реестра из SimpleInjector (например, репозитории, универсальные обработчики с декораторами...) в реализацию IHostedService, как показано ниже:
public class TimedService : IHostedService, IDisposable
{
private IJobRepository _repo;
private Timer _timer;
public TimedService(IJobRepository repo)
{
this._repo = repo;
}
...
...
...
}
Так как IHostedService
зарегистрирован в ASP.NET Core, а не в Simple Injector, я получаю следующую ошибку при запуске синхронизированной фоновой службы:
Необработанное исключение: System.InvalidOperationException: невозможно разрешить службу для типа "Optimization.Core.Interfaces.IJobRepository" при попытке активировать "Optimization.API.BackgroundServices.TimedService".
Итак, мой вопрос: как лучше всего реализовать фоновые задачи в Simple Injector? Требует ли это отдельного пакета интеграции, чем стандартная интеграция MVC? Как я могу ввести свои регистрации Simple Injector в IHostedService
? Если бы мы могли автоматически запустить службу после регистрации в Simple Injector, я думаю, что это решило бы эту проблему.
Спасибо за любые ссылки здесь и за любые советы на эту тему! Я мог бы сделать что-то не так. Мне очень понравилось использовать Simple Injector в прошлом году.