Telegram.Bot.Examples icon indicating copy to clipboard operation
Telegram.Bot.Examples copied to clipboard

Struggling with services lifetimes

Open dmrzn opened this issue 2 years ago • 2 comments

Hi Guys!

I'm using Telegram.Bot.Examples.Polling as a mechanism for my bot. I'm trying to have a service class that is a dependency of UpdateHandler class the following way: The service should be constructed per each update handling (UpdateHandler call)

My initial attempt was to register that service as a scoped service but I found out that my scoped services live across multiple updates.

I'm looking at PollingServiceBase class and see that a scope is being created there:

    // Create new IServiceScope on each iteration.
    // This way we can leverage benefits of Scoped TReceiverService
    // and typed HttpClient - we'll grab "fresh" instance each time
    using var scope = _serviceProvider.CreateScope();
    var receiver = scope.ServiceProvider.GetRequiredService<TReceiverService>();

    await receiver.ReceiveAsync(stoppingToken);

My question is: What does the scope span in PollingServiceBase.DoWork method?

The call of receiver.ReceiveAsync(stoppingToken) never completes: Internally it calls ITelegramBotClient.ReceiveAsync extension method which in its turn calls DefaultUpdateReceiver.ReceiveAsync which internally is implemented using while (!cancellationToken.IsCancellationRequested) loop.

dmrzn avatar Oct 17 '23 07:10 dmrzn

If you need scoped solution you can try: https://github.com/TgBotFramework/TgBotFramework.Template

Fedorus avatar Oct 17 '23 08:10 Fedorus

Still would be great to know the motivation of the scope creating code I mentioned above.

dmrzn avatar Oct 18 '23 16:10 dmrzn

as I understand it, _serviceProvider.CreateScope(); doesn't create a new scope really, it's just a way to obtain a resolver service to find our globally scoped ReceiverService already created in Program.cs: services.AddScoped<ReceiverService>();

wiz0u avatar Jul 01 '24 12:07 wiz0u