Пример задачи с отдельным классом метаданных
Класс реализующий IPRBackgroundTask + класс IPRBackgroundTaskMetadata
В данном примере логика фоновой задачи и её метаданные вынесены в разные классы, что позволяет разделить ответственность и переиспользовать конфигурацию задачи независимо от её реализации.
Класс ExampleBackgroundTasksMetadata реализует интерфейс IPRBackgroundTaskMetadata и отвечает исключительно за описание параметров выполнения фоновой задачи:
Id— уникальный идентификатор задачи, по которому происходит сопоставление с реализацией фоновой задачи;Name— имя задачи;InitialDelaySeconds— задержка перед первым запуском;RepeatSeconds— интервал повторного выполнения;BotIds— список идентификаторов ботов, для которых разрешено выполнение задачи (пустая коллекция означает выполнение для всех ботов);MaxErrorAttempts— максимально допустимое количество ошибок выполнения;MaxRepeatCount— максимальное количество повторений задачи;
Класс ExampleWithoutMetadataBackgroundTasks реализует интерфейс IPRBackgroundTask и содержит только бизнес-логику фоновой задачи:
Initialize— инициализация задачи для конкретного бота;CanExecute— проверка возможности выполнения задачи;ExecuteAsync— основной код выполнения фоновой задачи.
Связь между логикой задачи и её метаданными осуществляется через совпадающее значение свойства Id.
При инициализации PRBackgroundTaskRunner автоматически сопоставляет реализацию фоновой задачи с соответствующими метаданными.
using AspNetExample.Models;
using PRTelegramBot.BackgroundTasks.Interfaces;
using PRTelegramBot.Core;
namespace AspNetExample.BackgroundTasks
{
public class ExampleBackgroundTasksMetadata : IPRBackgroundTaskMetadata
{
public HashSet<long> BotIds { get; } = new HashSet<long>();
public Guid Id => Constants.EXAMPLE_TASK_WITHOUT_METADATA;
public string Name => nameof(ExampleBackgroundTasksMetadata);
public int? InitialDelaySeconds => 1;
public int? RepeatSeconds => 1;
public int? MaxErrorAttempts => PRConstants.INFINITY;
public int? MaxRepeatCount => -1;
}
}
using AspNetExample.Models;
using PRTelegramBot.BackgroundTasks.Interfaces;
using PRTelegramBot.Core;
using System.Diagnostics;
namespace AspNetExample.BackgroundTasks
{
public class ExampleWithoutMetadataBackgroundTasks : IPRBackgroundTask
{
public Guid Id => Constants.EXAMPLE_TASK_WITHOUT_METADATA;
public Task ExecuteAsync(CancellationToken cancellationToken)
{
Debug.WriteLine($"Execute {nameof(ExampleWithoutMetadataBackgroundTasks)}");
return Task.CompletedTask;
}
public Task<bool> CanExecute()
{
return Task.FromResult(true);
}
public Task Initialize(PRBotBase bot)
{
return Task.CompletedTask;
}
}
}
Такой подход удобен в случаях, когда:
метаданные задачи формируются динамически (например, из конфигурации или базы данных);
требуется переиспользовать одну и ту же реализацию задачи с разными параметрами;
необходимо чётко разделить конфигурацию и бизнес-логику фоновых задач.
Last updated