private static IServiceCollection GetInterceptableServices(IServiceProvider serviceProvider, IServiceCollection services)
        {
            var serviceCollection = new ServiceCollection();

            foreach (var service in services)
            {
                bool isOpneGeneric = service.ServiceType.GetTypeInfo().IsGenericTypeDefinition;
                Func <IServiceProvider, object> factory = _ => Wrap(serviceProvider, service.ServiceType);
                switch (service.Lifetime)
                {
                case ServiceLifetime.Scoped:
                {
                    if (isOpneGeneric)
                    {
                        serviceCollection.AddScoped(service.ServiceType, service.ImplementationType);
                    }
                    else
                    {
                        serviceCollection.AddScoped(service.ServiceType, factory);
                    }
                    break;
                }

                case ServiceLifetime.Singleton:
                {
                    if (isOpneGeneric)
                    {
                        serviceCollection.AddSingleton(service.ServiceType, service.ImplementationType);
                    }
                    else
                    {
                        serviceCollection.AddSingleton(service.ServiceType, factory);
                    }
                    break;
                }

                case ServiceLifetime.Transient:
                {
                    if (isOpneGeneric)
                    {
                        serviceCollection.AddTransient(service.ServiceType, service.ImplementationType);
                    }
                    else
                    {
                        serviceCollection.AddTransient(service.ServiceType, factory);
                    }
                    break;
                }
                }
            }

            foreach (var group in serviceCollection.GroupBy(_ => _.ServiceType))
            {
                if (group.Count() > 1)
                {
                    serviceCollection.AddTransient(typeof(IEnumerable <>).MakeGenericType(group.Key),
                                                   _ =>
                    {
                        IProxyFactory proxyFactory = serviceProvider.GetRequiredService <IProxyFactory>();
                        var proxies = serviceProvider.GetServices(group.Key).Select(target => proxyFactory.CreateProxy(group.Key, target)).ToArray();
                        Array array = Array.CreateInstance(group.Key, proxies.Length);
                        for (int i = 0; i < group.Count(); i++)
                        {
                            array.SetValue(proxies[i], i);
                        }
                        return(array);
                    });
                }
            }
            return(serviceCollection);
        }