2020-12-24 09:50:05 +11:00
|
|
|
using System;
|
2020-10-30 11:16:17 +00:00
|
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
|
|
|
using Microsoft.Extensions.DependencyInjection.Extensions;
|
2021-02-18 11:06:02 +01:00
|
|
|
using Umbraco.Cms.Core.Composing;
|
2020-10-30 11:16:17 +00:00
|
|
|
|
2021-02-18 11:06:02 +01:00
|
|
|
namespace Umbraco.Extensions
|
2020-10-30 11:16:17 +00:00
|
|
|
{
|
|
|
|
|
public static class ServiceCollectionExtensions
|
|
|
|
|
{
|
|
|
|
|
public static void AddUnique<TService, TImplementing>(this IServiceCollection services)
|
|
|
|
|
where TService : class
|
|
|
|
|
where TImplementing : class, TService
|
|
|
|
|
=> services.Replace(ServiceDescriptor.Singleton<TService, TImplementing>());
|
|
|
|
|
|
2020-10-30 19:56:26 +01:00
|
|
|
/// <summary>
|
2020-11-02 10:54:29 +00:00
|
|
|
/// Registers a singleton instance against multiple interfaces.
|
2020-10-30 19:56:26 +01:00
|
|
|
/// </summary>
|
2020-11-02 10:54:29 +00:00
|
|
|
public static void AddMultipleUnique<TService1, TService2, TImplementing>(this IServiceCollection services)
|
2020-10-30 19:56:26 +01:00
|
|
|
where TService1 : class
|
|
|
|
|
where TService2 : class
|
|
|
|
|
where TImplementing : class, TService1, TService2
|
|
|
|
|
{
|
2020-11-02 10:54:29 +00:00
|
|
|
services.AddUnique<TService1, TImplementing>();
|
2020-12-24 09:50:05 +11:00
|
|
|
services.AddUnique<TService2>(factory => (TImplementing)factory.GetRequiredService<TService1>());
|
2020-10-30 19:56:26 +01:00
|
|
|
}
|
|
|
|
|
|
2020-10-30 11:16:17 +00:00
|
|
|
public static void AddUnique<TImplementing>(this IServiceCollection services)
|
|
|
|
|
where TImplementing : class
|
|
|
|
|
=> services.Replace(ServiceDescriptor.Singleton<TImplementing, TImplementing>());
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Registers a unique service with an implementation factory.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <remarks>Unique services have one single implementation, and a Singleton lifetime.</remarks>
|
|
|
|
|
public static void AddUnique<TService>(this IServiceCollection services, Func<IServiceProvider, TService> factory)
|
|
|
|
|
where TService : class
|
|
|
|
|
=> services.Replace(ServiceDescriptor.Singleton(factory));
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Registers a unique service with an implementing instance.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <remarks>Unique services have one single implementation, and a Singleton lifetime.</remarks>
|
|
|
|
|
public static void AddUnique(this IServiceCollection services, Type serviceType, object instance)
|
|
|
|
|
=> services.Replace(ServiceDescriptor.Singleton(serviceType, instance));
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Registers a unique service with an implementing instance.
|
|
|
|
|
/// </summary>
|
|
|
|
|
public static void AddUnique<TService>(this IServiceCollection services, TService instance)
|
|
|
|
|
where TService : class
|
2020-12-24 09:50:05 +11:00
|
|
|
=> services.Replace(ServiceDescriptor.Singleton(instance));
|
2020-10-30 11:16:17 +00:00
|
|
|
|
2020-12-24 11:46:17 +11:00
|
|
|
internal static IServiceCollection AddLazySupport(this IServiceCollection services)
|
2020-10-30 11:16:17 +00:00
|
|
|
{
|
|
|
|
|
services.Replace(ServiceDescriptor.Transient(typeof(Lazy<>), typeof(LazyResolve<>)));
|
|
|
|
|
return services;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|