mirror of https://github.com/abpframework/abp.git
2 changed files with 46 additions and 0 deletions
@ -0,0 +1,43 @@ |
|||
using System; |
|||
using System.Collections.Concurrent; |
|||
using System.Reflection; |
|||
using Autofac.Core.Activators.Reflection; |
|||
|
|||
namespace Volo.Abp.Autofac |
|||
{ |
|||
public class AbpAutofacConstructorFinder : IConstructorFinder |
|||
{ |
|||
private const BindingFlags DeclaredOnlyPublicFlags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly; //Remove static constructor, BindingFlags.Static
|
|||
|
|||
private readonly Func<Type, ConstructorInfo[]> _finder; |
|||
|
|||
private static readonly ConcurrentDictionary<Type, ConstructorInfo[]> DefaultPublicConstructorsCache = new ConcurrentDictionary<Type, ConstructorInfo[]>(); |
|||
|
|||
public AbpAutofacConstructorFinder() |
|||
: this(GetDefaultPublicConstructors) |
|||
{ |
|||
} |
|||
|
|||
public AbpAutofacConstructorFinder(Func<Type, ConstructorInfo[]> finder) |
|||
{ |
|||
_finder = finder ?? throw new ArgumentNullException(nameof(finder)); |
|||
} |
|||
|
|||
public ConstructorInfo[] FindConstructors(Type targetType) |
|||
{ |
|||
return _finder(targetType); |
|||
} |
|||
|
|||
private static ConstructorInfo[] GetDefaultPublicConstructors(Type type) |
|||
{ |
|||
var retval = DefaultPublicConstructorsCache.GetOrAdd(type, t => t.GetConstructors(DeclaredOnlyPublicFlags)); |
|||
|
|||
if (retval.Length == 0) |
|||
{ |
|||
throw new NoConstructorsFoundException(type); |
|||
} |
|||
|
|||
return retval; |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue