Browse Source

Revised ConventionalRegistrarList, so they are stored inside service collection.

pull/81/head
Halil İbrahim Kalkan 10 years ago
parent
commit
d969aceb5b
  1. 10
      src/Volo.DependencyInjection/Microsoft/Extensions/DependencyInjection/ConventionalRegistrarList.cs
  2. 27
      src/Volo.DependencyInjection/Microsoft/Extensions/DependencyInjection/ServiceCollectionConventionalRegistrationExtensions.cs
  3. 5
      src/Volo.DependencyInjection/Microsoft/Extensions/DependencyInjection/ServiceCollectionObjectAccessorExtensions.cs

10
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<IConventionalRegistrar>
{
}
}

27
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.DependencyInjection;
using Volo.ExtensionMethods.Collections.Generic;
namespace Microsoft.Extensions.DependencyInjection namespace Microsoft.Extensions.DependencyInjection
{ {
@ -12,19 +10,12 @@ namespace Microsoft.Extensions.DependencyInjection
public static class ServiceCollectionConventionalRegistrationExtensions public static class ServiceCollectionConventionalRegistrationExtensions
{ {
private static readonly ConcurrentDictionary<IServiceCollection, List<IConventionalRegistrar>> ConventionalRegistrars;
static ServiceCollectionConventionalRegistrationExtensions()
{
ConventionalRegistrars = new ConcurrentDictionary<IServiceCollection, List<IConventionalRegistrar>>();
}
public static IServiceCollection AddConventionalRegistrar(this IServiceCollection services, IConventionalRegistrar registrar) public static IServiceCollection AddConventionalRegistrar(this IServiceCollection services, IConventionalRegistrar registrar)
{ {
GetOrCreateRegistrarList(services).Add(registrar); GetOrCreateRegistrarList(services).Add(registrar);
return services; return services;
} }
internal static List<IConventionalRegistrar> GetConventionalRegistrars(this IServiceCollection services) internal static List<IConventionalRegistrar> GetConventionalRegistrars(this IServiceCollection services)
{ {
return GetOrCreateRegistrarList(services); return GetOrCreateRegistrarList(services);
@ -32,12 +23,14 @@ namespace Microsoft.Extensions.DependencyInjection
private static List<IConventionalRegistrar> GetOrCreateRegistrarList(IServiceCollection services) private static List<IConventionalRegistrar> GetOrCreateRegistrarList(IServiceCollection services)
{ {
return ConventionalRegistrars.GetOrAdd( var conventionalRegistrars = services.GetSingletonInstanceOrNull<IObjectAccessor<ConventionalRegistrarList>>()?.Value;
services, if (conventionalRegistrars == null)
() => new List<IConventionalRegistrar> {
{ conventionalRegistrars = new ConventionalRegistrarList { new DefaultConventionalRegistrar() };
new DefaultConventionalRegistrar() services.AddObjectAccessor(conventionalRegistrars);
}); }
return conventionalRegistrars;
} }
} }
} }

5
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); throw new Exception("An object accessor is registered before for type: " + typeof(T).AssemblyQualifiedName);
} }
services.AddSingleton(typeof(IObjectAccessor<T>), accessor); //Add to the beginning for fast retrieve
services.AddSingleton(typeof(ObjectAccessor<T>), accessor); services.Insert(0, ServiceDescriptor.Singleton(typeof(ObjectAccessor<T>), accessor));
services.Insert(0, ServiceDescriptor.Singleton(typeof(IObjectAccessor<T>), accessor));
return accessor; return accessor;
} }

Loading…
Cancel
Save