booking-microservices/BuildingBlocks/Web/ServiceCollectionExtensions.cs
2025-03-15 01:39:43 +03:30

72 lines
2.4 KiB
C#

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