using Microsoft.Extensions.DependencyInjection; using NSubstitute; namespace BuildingBlocks.Web; public static class ServiceCollectionExtensions { public static void ReplaceScoped(this IServiceCollection services) where TService : class where TImplementation : class, TService { services.Unregister(); services.AddScoped(); } public static void ReplaceScoped(this IServiceCollection services, Func implementationFactory) where TService : class { services.Unregister(); services.AddScoped(implementationFactory); } public static void ReplaceTransient(this IServiceCollection services) where TService : class where TImplementation : class, TService { services.Unregister(); services.AddTransient(); } public static void ReplaceTransient(this IServiceCollection services, Func implementationFactory) where TService : class { services.Unregister(); services.AddTransient(implementationFactory); } public static void ReplaceSingleton(this IServiceCollection services) where TService : class where TImplementation : class, TService { services.Unregister(); services.AddSingleton(); } public static void ReplaceSingleton(this IServiceCollection services, Func implementationFactory) where TService : class { services.Unregister(); services.AddSingleton(implementationFactory); } public static void Unregister(this IServiceCollection services) { var descriptor = services.FirstOrDefault(d => d.ServiceType == typeof(TService)); services.Remove(descriptor); } public static IServiceCollection ReplaceServiceWithSingletonMock(this IServiceCollection services) where TService : class { var service = services.FirstOrDefault(d => d.ServiceType == typeof(TService)); services.Remove(service); services.AddSingleton(_ => Substitute.For()); return services; } }