diff --git a/src/Volo.DependencyInjection/Microsoft/Extensions/DependencyInjection/ConventionalRegistrarList.cs b/src/Volo.DependencyInjection/Microsoft/Extensions/DependencyInjection/ConventionalRegistrarList.cs new file mode 100644 index 0000000000..74eece6493 --- /dev/null +++ b/src/Volo.DependencyInjection/Microsoft/Extensions/DependencyInjection/ConventionalRegistrarList.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; +using Volo.DependencyInjection; + +namespace Microsoft.Extensions.DependencyInjection +{ + internal class ConventionalRegistrarList : List + { + + } +} \ No newline at end of file diff --git a/src/Volo.DependencyInjection/Microsoft/Extensions/DependencyInjection/ServiceCollectionConventionalRegistrationExtensions.cs b/src/Volo.DependencyInjection/Microsoft/Extensions/DependencyInjection/ServiceCollectionConventionalRegistrationExtensions.cs index 6c1f978caf..409f018b8b 100644 --- a/src/Volo.DependencyInjection/Microsoft/Extensions/DependencyInjection/ServiceCollectionConventionalRegistrationExtensions.cs +++ b/src/Volo.DependencyInjection/Microsoft/Extensions/DependencyInjection/ServiceCollectionConventionalRegistrationExtensions.cs @@ -1,7 +1,5 @@ -using System.Collections.Concurrent; -using System.Collections.Generic; +using System.Collections.Generic; using Volo.DependencyInjection; -using Volo.ExtensionMethods.Collections.Generic; namespace Microsoft.Extensions.DependencyInjection { @@ -12,19 +10,12 @@ namespace Microsoft.Extensions.DependencyInjection public static class ServiceCollectionConventionalRegistrationExtensions { - private static readonly ConcurrentDictionary> ConventionalRegistrars; - - static ServiceCollectionConventionalRegistrationExtensions() - { - ConventionalRegistrars = new ConcurrentDictionary>(); - } - public static IServiceCollection AddConventionalRegistrar(this IServiceCollection services, IConventionalRegistrar registrar) { GetOrCreateRegistrarList(services).Add(registrar); return services; } - + internal static List GetConventionalRegistrars(this IServiceCollection services) { return GetOrCreateRegistrarList(services); @@ -32,12 +23,14 @@ namespace Microsoft.Extensions.DependencyInjection private static List GetOrCreateRegistrarList(IServiceCollection services) { - return ConventionalRegistrars.GetOrAdd( - services, - () => new List - { - new DefaultConventionalRegistrar() - }); + var conventionalRegistrars = services.GetSingletonInstanceOrNull>()?.Value; + if (conventionalRegistrars == null) + { + conventionalRegistrars = new ConventionalRegistrarList { new DefaultConventionalRegistrar() }; + services.AddObjectAccessor(conventionalRegistrars); + } + + return conventionalRegistrars; } } } \ No newline at end of file diff --git a/src/Volo.DependencyInjection/Microsoft/Extensions/DependencyInjection/ServiceCollectionObjectAccessorExtensions.cs b/src/Volo.DependencyInjection/Microsoft/Extensions/DependencyInjection/ServiceCollectionObjectAccessorExtensions.cs index c3ccf423d2..28ad3cb079 100644 --- a/src/Volo.DependencyInjection/Microsoft/Extensions/DependencyInjection/ServiceCollectionObjectAccessorExtensions.cs +++ b/src/Volo.DependencyInjection/Microsoft/Extensions/DependencyInjection/ServiceCollectionObjectAccessorExtensions.cs @@ -33,8 +33,9 @@ namespace Microsoft.Extensions.DependencyInjection throw new Exception("An object accessor is registered before for type: " + typeof(T).AssemblyQualifiedName); } - services.AddSingleton(typeof(IObjectAccessor), accessor); - services.AddSingleton(typeof(ObjectAccessor), accessor); + //Add to the beginning for fast retrieve + services.Insert(0, ServiceDescriptor.Singleton(typeof(ObjectAccessor), accessor)); + services.Insert(0, ServiceDescriptor.Singleton(typeof(IObjectAccessor), accessor)); return accessor; }