У меня есть записи базы данных, для каждой из которых у меня должны быть повторяющиеся задания при запуске приложения. Я думал, что смогу сделать это, используя IHostedService
и DI'ing сервис области, но это невозможно, потому что мой сервис области имеет меньший срок службы. IHostedService
требуется одноэлементная служба, которая приводит к тупику, потому что ApplicationDbContext требует сервис с областью действия.
InvalidOperationException: Невозможно использовать сервис с ограниченным диапазоном 'Binance.Services.IBotService' из одноэлементного 'Microsoft.Extensions.Hosting. .IHostedService '.
Мне просто нужно выполнить эту логику при запуске приложения. Что лучше в таких сценариях?
namespace Binance.Services
{
public class BotHostedService : IHostedService
{
private readonly ILogger _logger;
private readonly IBotService _botService;
private int _numberOfBots;
public BotHostedService(ILogger<BotHostedService> logger, IBotService botService)
{
_logger = logger;
_botService = botService;
}
public async Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Bot service is starting.");
var bots = await _botService.GetAllAsync();
_numberOfBots = bots.Count;
for (int i = 0; i < _numberOfBots; i++)
{
Bot bot = bots[i];
_logger.LogDebug($"{bot.Name} is starting. Symbol: {bot.CryptoPair.Description}, Interval: {bot.TimeInterval.Description}");
RecurringJob.AddOrUpdate($"bot{i}", () => DoWork(bot), $"0/5 * * * *", TimeZoneInfo.Local);
}
}
public void DoWork(Bot bot)
{
_logger.LogError($"{bot.Name} is working. Current time: {DateTime.Now.ToLocalTime()}");
}
public Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Bot service is stopping.");
for (int i = 0; i < _numberOfBots; i++)
{
RecurringJob.RemoveIfExists($"bot{i}");
}
return Task.CompletedTask;
}
}
}