using System; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Umbraco.Core; using Umbraco.Core.Composing; namespace Umbraco.Core.DependencyInjection { public static class ServiceCollectionExtensions { public static void AddUnique(this IServiceCollection services) where TService : class where TImplementing : class, TService => services.Replace(ServiceDescriptor.Singleton()); /// /// Registers a singleton instance against multiple interfaces. /// public static void AddMultipleUnique(this IServiceCollection services) where TService1 : class where TService2 : class where TImplementing : class, TService1, TService2 { services.AddUnique(); services.AddUnique(factory => (TImplementing)factory.GetRequiredService()); } public static void AddUnique(this IServiceCollection services) where TImplementing : class => services.Replace(ServiceDescriptor.Singleton()); /// /// Registers a unique service with an implementation factory. /// /// Unique services have one single implementation, and a Singleton lifetime. public static void AddUnique(this IServiceCollection services, Func factory) where TService : class => services.Replace(ServiceDescriptor.Singleton(factory)); /// /// Registers a unique service with an implementing instance. /// /// Unique services have one single implementation, and a Singleton lifetime. public static void AddUnique(this IServiceCollection services, Type serviceType, object instance) => services.Replace(ServiceDescriptor.Singleton(serviceType, instance)); /// /// Registers a unique service with an implementing instance. /// public static void AddUnique(this IServiceCollection services, TService instance) where TService : class => services.Replace(ServiceDescriptor.Singleton(instance)); internal static IServiceCollection AddLazySupport(this IServiceCollection services) { services.Replace(ServiceDescriptor.Transient(typeof(Lazy<>), typeof(LazyResolve<>))); return services; } } }