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