public static IServiceCollection AddGrpcClientCustomPool <TClient>(this IServiceCollection services, GrpcClientPoolSettings clientSettings)
            where TClient : ClientBase
        {
            services.AddSingleton(p =>
            {
                return(new GrpcClientPool <TClient>(clientSettings));
            });

            services.Add(ServiceDescriptor.Describe(typeof(TClient), (ServiceProvider) =>
            {
                var pool = ServiceProvider.GetRequiredService <GrpcClientPool <TClient> >();

                return(pool.Get());
            }, ServiceLifetime.Transient));

            return(services);
        }
        public static IServiceCollection AddGrpcClientPool <TClient>(this IServiceCollection services, GrpcClientPoolSettings clientSettings)
            where TClient : ClientBase
        {
            if (!services.Any(x => x.ServiceType == typeof(ObjectPoolProvider)))
            {
                services.TryAddSingleton <ObjectPoolProvider, DefaultObjectPoolProvider>();
            }

            services.TryAddSingleton <ObjectPool <TClient> >(serviceProvider =>
            {
                var provider = serviceProvider.GetRequiredService <ObjectPoolProvider>();

                var channel = new Channel(clientSettings.TargetServerURL, ChannelCredentials.Insecure);

                var policy = new GrpcClientPooledObjectPolicy <TClient>(channel);

                return(provider.Create(policy));
            });

            services.AddTransient <TClient>(sp => sp.GetRequiredService <ObjectPool <TClient> >().Get());

            return(services);
        }