TelegramBots/Telegram.Bot.Examples

Struggling with services lifetimes

dmrzn opened this issue ยท 3 comments

dmrzn commented

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.

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

dmrzn commented

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

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>();