using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Telegrator.Core; using Telegrator.Core.Descriptors; using Telegrator.Core.Handlers; namespace Telegrator.Providers; /// public class HostHandlersProvider : HandlersProvider { private readonly IServiceProvider Services; /// public HostHandlersProvider( IHandlersCollection handlers, IOptions options, IServiceProvider serviceProvider) : base(handlers, options.Value) { Services = serviceProvider; } /// public override UpdateHandlerBase GetHandlerInstance(HandlerDescriptor descriptor, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); IServiceScope scope = Services.CreateScope(); object handlerInstance = descriptor.ServiceKey == null ? scope.ServiceProvider.GetRequiredService(descriptor.HandlerType) : scope.ServiceProvider.GetRequiredKeyedService(descriptor.HandlerType, descriptor.ServiceKey); if (handlerInstance is not UpdateHandlerBase updateHandler) throw new InvalidOperationException("Failed to resolve " + descriptor.HandlerType + " as UpdateHandlerBase"); descriptor.LazyInitialization?.Invoke(updateHandler); updateHandler.LifetimeToken.OnLifetimeEnded += _ => scope.Dispose(); return updateHandler; } }