33 lines
1.1 KiB
C#
33 lines
1.1 KiB
C#
|
|
using System;
|
||
|
|
using System.Collections.Concurrent;
|
||
|
|
using System.Reflection;
|
||
|
|
|
||
|
|
namespace VContainer.Internal
|
||
|
|
{
|
||
|
|
public static class InjectorCache
|
||
|
|
{
|
||
|
|
static readonly ConcurrentDictionary<Type, IInjector> Injectors = new ConcurrentDictionary<Type, IInjector>();
|
||
|
|
|
||
|
|
public static IInjector GetOrBuild(Type type)
|
||
|
|
{
|
||
|
|
return Injectors.GetOrAdd(type, key =>
|
||
|
|
{
|
||
|
|
// SourceGenerator
|
||
|
|
var generatedType = key.Assembly.GetType($"{key.FullName}GeneratedInjector", false);
|
||
|
|
if (generatedType != null)
|
||
|
|
{
|
||
|
|
return (IInjector)Activator.CreateInstance(generatedType);
|
||
|
|
}
|
||
|
|
|
||
|
|
// IL weaving (Deprecated)
|
||
|
|
var getter = key.GetMethod("__GetGeneratedInjector", BindingFlags.Static | BindingFlags.Public);
|
||
|
|
if (getter != null)
|
||
|
|
{
|
||
|
|
return (IInjector)getter.Invoke(null, null);
|
||
|
|
}
|
||
|
|
return ReflectionInjector.Build(key);
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|