using Microsoft.Extensions.DependencyInjection; using System.Collections.Generic; using System.Data; using System; using System.Linq; namespace Church.Net.WebAPI.Extensions { public static class ServiceCollectionExtensions { public static IServiceCollection Remove(this IServiceCollection services) { if (services.IsReadOnly) { throw new ReadOnlyException($"{nameof(services)} is read only"); } var serviceDescriptors = services.Where(descriptor => descriptor.ServiceType == typeof(T)); if (serviceDescriptors.Any()) { foreach (var service in serviceDescriptors) { services.Remove(service); } } return services; } public static IServiceCollection OverWriteTransient(this IServiceCollection services) where TService : class where TImplementation : class, TService { services.Remove(); services.AddTransient(); return services; } public static IServiceCollection OverWriteScoped(this IServiceCollection services) where TService : class where TImplementation : class, TService { services.Remove(); services.AddScoped(); return services; } public static IServiceCollection OverWriteSingleton(this IServiceCollection services) where TService : class where TImplementation : class, TService { services.Remove(); services.AddSingleton(); return services; } //public static void AddFactory(this IServiceCollection services) //where TService : class //where TImplementation : class, TService //{ // services.AddTransient(); // services.AddSingleton>(x => () => x.GetService()); // services.AddSingleton, Factory>(); //} public static IServiceCollection AddMultiScoped(this IServiceCollection services) where IService : class where TBaseImplementation : class, IService { foreach (var type in GetImplementedTypes()) { services.AddScoped(h => (IService)Activator.CreateInstance(type)); } return services; } public static IServiceCollection AddMultiTransient(this IServiceCollection services) where IService : class where TBaseImplementation : class, IService { foreach (var type in GetImplementedTypes()) { services.AddTransient(h => (IService)Activator.CreateInstance(type)); } return services; } public static IServiceCollection AddMultiSingleton(this IServiceCollection services) where IService : class where TBaseImplementation : class, IService { foreach (var type in GetImplementedTypes()) { services.AddSingleton(h => (IService)Activator.CreateInstance(type)); } return services; } private static IEnumerable GetImplementedTypes() where TBaseImplementation : class, TService { Type interfaceType = typeof(TService); Type baseType = typeof(TBaseImplementation); IEnumerable types = System.Reflection.Assembly.GetAssembly(baseType).GetTypes() .Where(p => !p.IsInterface && p != baseType && interfaceType.IsAssignableFrom(p)); return types; } } }