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.ExtensionMethods.Collections.Generic;
namespace Microsoft.Extensions.DependencyInjection
{
@ -12,19 +10,12 @@ namespace Microsoft.Extensions.DependencyInjection
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)
{
GetOrCreateRegistrarList(services).Add(registrar);
return services;
}
internal static List<IConventionalRegistrar> GetConventionalRegistrars(this IServiceCollection services)
{
return GetOrCreateRegistrarList(services);
@ -32,12 +23,14 @@ namespace Microsoft.Extensions.DependencyInjection
private static List<IConventionalRegistrar> GetOrCreateRegistrarList(IServiceCollection services)
{
return ConventionalRegistrars.GetOrAdd(
services,
() => new List<IConventionalRegistrar>
{
new DefaultConventionalRegistrar()
});
var conventionalRegistrars = services.GetSingletonInstanceOrNull<IObjectAccessor<ConventionalRegistrarList>>()?.Value;
if (conventionalRegistrars == null)
{
conventionalRegistrars = new ConventionalRegistrarList { 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);
}
services.AddSingleton(typeof(IObjectAccessor<T>), accessor);
services.AddSingleton(typeof(ObjectAccessor<T>), accessor);
//Add to the beginning for fast retrieve
services.Insert(0, ServiceDescriptor.Singleton(typeof(ObjectAccessor<T>), accessor));
services.Insert(0, ServiceDescriptor.Singleton(typeof(IObjectAccessor<T>), accessor));
return accessor;
}

Loading…
Cancel
Save