IHostedService одним из главных нововведений в Microsoft.Extensions.Hosting в .NET 8 стало добавление нового интерфейса IHostedLifecycleService, который значительно упрощает управление жизненным циклом служб. Данный интерфейс интерфейс расширяет
IHostedService, добавляя методы для событий жизненного цикла, которые происходят до или после существующих StartAsync и StopAsync:public partial interface IHostedLifecycleService : Microsoft.Extensions.Hosting.IHostedService
{
Task StartingAsync(CancellationToken cancellationToken);
Task StartedAsync(CancellationToken cancellationToken);
Task StoppingAsync(CancellationToken cancellationToken);
Task StoppedAsync(CancellationToken cancellationToken);
}
Метод
StartingAsync для всех зарегистрированных служб будет запущен прежде, чем будет вызван StartAsync. Это может использоваться для выполнения некоторых проверок перед запуском приложения или инициализацией, например для проверки лицензий, обновлении кешей, применение миграций бд, инициализацию зависимостей (синглтонов). Это позволяет нам, если что-то пойдет не так, потенциально остановить приложение до того, как какие-либо размещенные службы начнут выполнять свою основную рабочую нагрузку.StartedAsync будет вызываться после завершения всех методов StartAsync для зарегистрированных размещенных служб. Это может использоваться для проверки состояния или условий приложения непосредственно перед тем, как отметить приложение как успешно запущенное.StoppingAsync может использоваться для сохранения состояния перед завершением, а StoppedAsync - для информирования других зависимостей о том, что служба более не доступна.public class DatabaseLifecycleService : IHostedLifecycleService
{
public async Task StartingAsync(CancellationToken cancellationToken)
{
Console.WriteLine("StartingAsync: Проверка конфигурации...");
await Task.Delay(500, cancellationToken);
}
public async Task StartAsync(CancellationToken cancellationToken)
{
Console.WriteLine("StartAsync: Подключение к базе данных...");
await Task.Delay(500, cancellationToken);
}
public async Task StartedAsync(CancellationToken cancellationToken)
{
Console.WriteLine("StartedAsync: Приложение готово!");
}
public async Task StoppingAsync(CancellationToken cancellationToken)
{
Console.WriteLine("StoppingAsync: Закрытие соединений...");
await Task.Delay(500, cancellationToken);
}
public async Task StopAsync(CancellationToken cancellationToken)
{
Console.WriteLine("StopAsync: Служба завершает работу...");
}
public async Task StoppedAsync(CancellationToken cancellationToken)
{
Console.WriteLine("StoppedAsync: Соединения закрыты. Служба завершена.");
}
}