private static ConstructorInfo GetMostParametersConstructor(Type type) { var finder = new DefaultConstructorFinder(); var publicConstructors = finder.FindConstructors(type); return(publicConstructors.OrderByDescending(x => x.GetParameters().Length).FirstOrDefault()); }
public void CanFindNonPublicConstructorsUsingFinderFunction() { var finder = new DefaultConstructorFinder(type => type.GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance)); var targetType = typeof(HasConstructors); var privateConstructor = targetType.GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance).Single(); var constructors = finder.FindConstructors(targetType).ToList(); Assert.Single(constructors); Assert.Contains(privateConstructor, constructors); }
public void FindsPublicConstructorsOnlyByDefault() { var finder = new DefaultConstructorFinder(); var targetType = typeof(HasConstructors); var publicConstructor = targetType.GetConstructor(new Type[0]); var constructors = finder.FindConstructors(targetType).ToList(); Assert.Single(constructors); Assert.Contains(publicConstructor, constructors); }
public void FindsPublicConstructorsOnlyByDefault() { var finder = new DefaultConstructorFinder(); var targetType = typeof(HasConstructors); var publicConstructor = targetType.GetConstructor(new Type[0]); var constructors = finder.FindConstructors(targetType).ToList(); Assert.That(constructors, Has.Count.EqualTo(1)); Assert.That(constructors, Has.Member(publicConstructor)); }
public void CanFindNonPublicConstructorsUsingFinderFunction() { var finder = new DefaultConstructorFinder(type => type.GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance)); var targetType = typeof(HasConstructors); var privateConstructor = targetType.GetConstructor( BindingFlags.NonPublic | BindingFlags.Instance, null, new[] { typeof(int) }, null); var constructors = finder.FindConstructors(targetType).ToList(); Assert.That(constructors, Has.Count.EqualTo(1)); Assert.That(constructors, Has.Member(privateConstructor)); }
private static ConstructorInfo GetMostParametersConstructor(Type type) { var container = new ContainerBuilder().Build(); var constructors = new DefaultConstructorFinder() .FindConstructors(type) .Select(c => new ConstructorParameterBinding(c, Enumerable.Empty <Parameter>(), container)) .ToArray(); return(new MostParametersConstructorSelector() .SelectConstructorBinding(constructors, Enumerable.Empty <Parameter>()) .TargetConstructor); }
public void RegisterDependencyInjectionTypes() { try { ContainerBuilder builder = new ContainerBuilder(); // Need to make Autofac find also "internal" constructors e.g. windows dialogs DefaultConstructorFinder constructorFinder = new DefaultConstructorFinder( type => type.GetConstructors( BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)); Assembly executingAssembly = Assembly.GetExecutingAssembly(); // Register single instance types builder.RegisterAssemblyTypes(executingAssembly) .Where(IsSingleInstance) .FindConstructorsWith(constructorFinder) .AsSelf() .AsImplementedInterfaces() .SingleInstance() .OwnedByLifetimeScope(); // Register non single instance types builder.RegisterAssemblyTypes(executingAssembly) .Where(t => !IsSingleInstance(t)) .FindConstructorsWith(constructorFinder) .AsSelf() .AsImplementedInterfaces() .OwnedByLifetimeScope(); container = builder.Build(); } catch (Exception e) { Log.Exception(e, "Failed to register types"); throw; } }
public void Execute(ResolveRequestContext context, Action <ResolveRequestContext> next) { next(context); if (context.Instance == null || context.Instance.IsProxy()) { return; } if (!(context.Registration.Activator is ReflectionActivator || context.Registration.Activator is DelegateActivator || context.Registration.Activator is InstanceActivator)) { return; } var limitType = context.Instance.GetType(); if (!limitType.GetTypeInfo().CanInherited()) { return; } if (excepts.Any(x => limitType.Name.Matches(x)) || excepts.Any(x => limitType.Namespace.Matches(x))) { return; } var services = context.Registration.Services.Select(x => ((IServiceWithType)x).ServiceType).ToList(); if (!services.All(x => x.GetTypeInfo().CanInherited()) || services.All(x => x.GetTypeInfo().IsNonAspect())) { return; } var aspectValidator = new AspectValidatorBuilder(context.Resolve <IAspectConfiguration>()).Build(); if (services.All(x => !aspectValidator.Validate(x, true)) && !aspectValidator.Validate(limitType, false)) { return; } var proxyTypeGenerator = context.Resolve <IProxyTypeGenerator>(); Type proxyType; object instance; var interfaceType = services.FirstOrDefault(x => x.GetTypeInfo().IsInterface); if (interfaceType == null) { var baseType = services.FirstOrDefault(x => x.GetTypeInfo().IsClass) ?? limitType; proxyType = proxyTypeGenerator.CreateClassProxyType(baseType, limitType); //Autofac.Core.Activators.Reflection.ReflectionActivator var constructorSelector = new MostParametersConstructorSelector(); var constructorFinder = new DefaultConstructorFinder(type => type.GetTypeInfo().DeclaredConstructors.ToArray()); var availableConstructors = constructorFinder.FindConstructors(proxyType); if (availableConstructors.Length == 0) { throw new NoConstructorsFoundException(proxyType, $"No constructors on type '{proxyType}' can be found with the constructor finder '{constructorFinder}'."); } var binders = new ConstructorBinder[availableConstructors.Length]; for (var idx = 0; idx < availableConstructors.Length; idx++) { binders[idx] = new ConstructorBinder(availableConstructors[idx]); } var allBindings = GetAllBindings(binders, context, context.Parameters); var selectedBinding = constructorSelector.SelectConstructorBinding(allBindings, context.Parameters); instance = selectedBinding.Instantiate(); } else { proxyType = proxyTypeGenerator.CreateInterfaceProxyType(interfaceType, limitType); instance = Activator.CreateInstance(proxyType, new object[] { context.Resolve <IAspectActivatorFactory>(), context.Instance }); } var propertyInjector = context.Resolve <IPropertyInjectorFactory>().Create(instance.GetType()); propertyInjector.Invoke(instance); context.Instance = instance; }