diff --git a/src/Umbraco.Core/DependencyInjection/ServiceCollectionExtensions.cs b/src/Umbraco.Core/DependencyInjection/ServiceCollectionExtensions.cs index 871a0bbe02..5cb9a7137f 100644 --- a/src/Umbraco.Core/DependencyInjection/ServiceCollectionExtensions.cs +++ b/src/Umbraco.Core/DependencyInjection/ServiceCollectionExtensions.cs @@ -7,50 +7,88 @@ namespace Umbraco.Extensions { public static class ServiceCollectionExtensions { - public static void AddUnique(this IServiceCollection services) + /// + /// Adds a service of type with an implementation type of to the specified . + /// + /// + /// Removes all previous registrations for the type . + /// + public static void AddUnique( + this IServiceCollection services, + ServiceLifetime lifetime = ServiceLifetime.Singleton) where TService : class where TImplementing : class, TService - => services.Replace(ServiceDescriptor.Singleton()); + { + services.RemoveAll(); + services.Add(ServiceDescriptor.Describe(typeof(TService), typeof(TImplementing), lifetime)); + } /// - /// Registers a singleton instance against multiple interfaces. + /// Adds services of types & with a shared implementation type of to the specified . /// - public static void AddMultipleUnique(this IServiceCollection services) + /// + /// Removes all previous registrations for the types & . + /// + public static void AddMultipleUnique( + this IServiceCollection services, + ServiceLifetime lifetime = ServiceLifetime.Singleton) where TService1 : class where TService2 : class where TImplementing : class, TService1, TService2 { - services.AddUnique(); - services.AddUnique(factory => (TImplementing)factory.GetRequiredService()); + services.AddUnique(lifetime); + services.AddUnique(factory => (TImplementing)factory.GetRequiredService(), lifetime); } // TODO(V11): Remove this function. [Obsolete("This method is functionally equivalent to AddSingleton() please use that instead.")] public static void AddUnique(this IServiceCollection services) where TImplementing : class - => services.Replace(ServiceDescriptor.Singleton()); + { + services.RemoveAll(); + services.AddSingleton(); + } /// - /// Registers a unique service with an implementation factory. + /// Adds a service of type with an implementation factory method to the specified . /// - /// Unique services have one single implementation, and a Singleton lifetime. - public static void AddUnique(this IServiceCollection services, Func factory) + /// + /// Removes all previous registrations for the type . + /// + public static void AddUnique( + this IServiceCollection services, + Func factory, + ServiceLifetime lifetime = ServiceLifetime.Singleton) where TService : class - => services.Replace(ServiceDescriptor.Singleton(factory)); + { + services.RemoveAll(); + services.Add(ServiceDescriptor.Describe(typeof(TService), factory, lifetime)); + } /// - /// Registers a unique service with an implementing instance. + /// Adds a singleton service of the type specified by to the specified . /// - /// Unique services have one single implementation, and a Singleton lifetime. + /// + /// Removes all previous registrations for the type specified by . + /// public static void AddUnique(this IServiceCollection services, Type serviceType, object instance) - => services.Replace(ServiceDescriptor.Singleton(serviceType, instance)); + { + services.RemoveAll(serviceType); + services.AddSingleton(serviceType, instance); + } /// - /// Registers a unique service with an implementing instance. + /// Adds a singleton service of type to the specified . /// + /// + /// Removes all previous registrations for the type type . + /// public static void AddUnique(this IServiceCollection services, TService instance) where TService : class - => services.Replace(ServiceDescriptor.Singleton(instance)); + { + services.RemoveAll(); + services.AddSingleton(instance); + } internal static IServiceCollection AddLazySupport(this IServiceCollection services) {