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);
        }
Beispiel #4
0
        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));
        }
Beispiel #5
0
        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);
        }
Beispiel #7
0
        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;
        }