|
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