Fixes issue with introduced MSDI abstractions where a single implemention is used for two interfaces, ensuring only one singleton instance is created.

This commit is contained in:
Andy Butland
2020-10-30 19:56:26 +01:00
parent a0ce44c9fc
commit ed8c29f902
2 changed files with 17 additions and 5 deletions

View File

@@ -12,6 +12,21 @@ namespace Umbraco.Core
where TImplementing : class, TService
=> services.Replace(ServiceDescriptor.Singleton<TService, TImplementing>());
/// <summary>
/// Registers a unique service as a single instance implementing two interfaces.
/// </summary>
/// <remarks>
/// Hat-tip: https://stackoverflow.com/a/55402016/489433
/// </remarks>
public static void AddUnique<TService1, TService2, TImplementing>(this IServiceCollection services)
where TService1 : class
where TService2 : class
where TImplementing : class, TService1, TService2
{
services.Replace(ServiceDescriptor.Singleton<TService1, TImplementing>());
services.Replace(ServiceDescriptor.Singleton<TService2, TImplementing>(x => (TImplementing)x.GetService<TService1>()));
}
public static void AddUnique<TImplementing>(this IServiceCollection services)
where TImplementing : class
=> services.Replace(ServiceDescriptor.Singleton<TImplementing, TImplementing>());

View File

@@ -55,13 +55,11 @@ namespace Umbraco.Web.Common.Runtime
composition.Services.AddUnique<IApplicationShutdownRegistry, AspNetCoreApplicationShutdownRegistry>();
// The umbraco request lifetime
composition.Services.AddUnique<IUmbracoRequestLifetime, UmbracoRequestLifetime>();
composition.Services.AddUnique<IUmbracoRequestLifetimeManager, UmbracoRequestLifetime>();
composition.Services.AddUnique<IUmbracoRequestLifetime, IUmbracoRequestLifetimeManager, UmbracoRequestLifetime>();
//Password hasher
// Password hasher
composition.Services.AddUnique<IPasswordHasher, AspNetCorePasswordHasher>();
composition.Services.AddUnique<ICookieManager, AspNetCoreCookieManager>();
composition.Services.AddTransient<IIpResolver, AspNetCoreIpResolver>();
composition.Services.AddUnique<IUserAgentProvider, AspNetCoreUserAgentProvider>();
@@ -76,7 +74,6 @@ namespace Umbraco.Web.Common.Runtime
composition.Services.AddUnique<IMacroRenderer, MacroRenderer>();
composition.Services.AddUnique<IMemberUserKeyProvider, MemberUserKeyProvider>();
// register the umbraco context factory
composition.Services.AddUnique<IUmbracoContextFactory, UmbracoContextFactory>();
composition.Services.AddUnique<IBackofficeSecurityFactory, BackofficeSecurityFactory>();