|
1 | 1 | namespace Console.Advanced.Abstract; |
2 | 2 |
|
3 | | -// A background service consuming a scoped service. |
4 | | -// See more: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services#consuming-a-scoped-service-in-a-background-task |
5 | | -/// <summary> |
6 | | -/// An abstract class to compose Polling background service and Receiver implementation classes |
7 | | -/// </summary> |
| 3 | +/// <summary>An abstract class to compose Polling background service and Receiver implementation classes</summary> |
| 4 | +/// <remarks>See more: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services#consuming-a-scoped-service-in-a-background-task</remarks> |
8 | 5 | /// <typeparam name="TReceiverService">Receiver implementation class</typeparam> |
9 | | -public abstract class PollingServiceBase<TReceiverService> : BackgroundService |
10 | | - where TReceiverService : IReceiverService |
| 6 | +public abstract class PollingServiceBase<TReceiverService>(IServiceProvider serviceProvider, ILogger<PollingServiceBase<TReceiverService>> logger) |
| 7 | + : BackgroundService where TReceiverService : IReceiverService |
11 | 8 | { |
12 | | - private readonly IServiceProvider _serviceProvider; |
13 | | - private readonly ILogger _logger; |
14 | | - |
15 | | - internal PollingServiceBase( |
16 | | - IServiceProvider serviceProvider, |
17 | | - ILogger<PollingServiceBase<TReceiverService>> logger) |
18 | | - { |
19 | | - _serviceProvider = serviceProvider; |
20 | | - _logger = logger; |
21 | | - } |
22 | | - |
23 | 9 | protected override async Task ExecuteAsync(CancellationToken stoppingToken) |
24 | 10 | { |
25 | | - _logger.LogInformation("Starting polling service"); |
26 | | - |
| 11 | + logger.LogInformation("Starting polling service"); |
27 | 12 | await DoWork(stoppingToken); |
28 | 13 | } |
29 | 14 |
|
30 | 15 | private async Task DoWork(CancellationToken stoppingToken) |
31 | 16 | { |
32 | | - // Make sure we receive updates until Cancellation Requested, |
33 | | - // no matter what errors our ReceiveAsync get |
| 17 | + // Make sure we receive updates until Cancellation Requested |
34 | 18 | while (!stoppingToken.IsCancellationRequested) |
35 | 19 | { |
36 | 20 | try |
37 | 21 | { |
38 | | - // Create new IServiceScope on each iteration. |
39 | | - // This way we can leverage benefits of Scoped TReceiverService |
40 | | - // and typed HttpClient - we'll grab "fresh" instance each time |
41 | | - using var scope = _serviceProvider.CreateScope(); |
| 22 | + // Create new IServiceScope on each iteration. This way we can leverage benefits |
| 23 | + // of Scoped TReceiverService and typed HttpClient - we'll grab "fresh" instance each time |
| 24 | + using var scope = serviceProvider.CreateScope(); |
42 | 25 | var receiver = scope.ServiceProvider.GetRequiredService<TReceiverService>(); |
43 | 26 |
|
44 | 27 | await receiver.ReceiveAsync(stoppingToken); |
45 | 28 | } |
46 | | - // Update Handler only captures exception inside update polling loop |
47 | | - // We'll catch all other exceptions here |
48 | | - // see: https://github.com/TelegramBots/Telegram.Bot/issues/1106 |
49 | 29 | catch (Exception ex) |
50 | 30 | { |
51 | | - _logger.LogError("Polling failed with exception: {Exception}", ex); |
52 | | - |
| 31 | + logger.LogError("Polling failed with exception: {Exception}", ex); |
53 | 32 | // Cooldown if something goes wrong |
54 | 33 | await Task.Delay(TimeSpan.FromSeconds(5), stoppingToken); |
55 | 34 | } |
|
0 commit comments