Ejemplo n.º 1
0
        public void WhenEnumTypeIsProvidedForIntParameterConversionWillBeAttempted()
        {
            var ci       = typeof(CtorWithInt).GetTypeInfo().DeclaredConstructors.Single();
            var cpb      = new ConstructorBinder(ci).Bind(new[] { new PositionalParameter(0, Foo.B), }, new ContainerBuilder().Build());
            var instance = (CtorWithInt)cpb.Instantiate();

            Assert.Equal(1, instance.Value);
        }
        public void Should_use_constructor()
        {
            var binder = new ConstructorBinder <MyClass>(provider);

            var result = binder.Bind(settings);

            result.Errors.Should().BeEmpty();
            result.Value.GetValue().Should().BeTrue();
        }
Ejemplo n.º 3
0
        public void WhenAnExceptionIsThrownFromAConstructor_TheInnerExceptionIsWrapped()
        {
            var ci  = typeof(ThrowsInCtor).GetTypeInfo().DeclaredConstructors.Single();
            var cpb = new ConstructorBinder(ci).Bind(Enumerable.Empty <Parameter>(), new ContainerBuilder().Build());
            var dx  = Assert.Throws <DependencyResolutionException>(() =>
                                                                    cpb.Instantiate());

            Assert.Contains(typeof(ThrowsInCtor).Name, dx.Message);
            Assert.Equal(ThrowsInCtor.Message, dx.InnerException.Message);
        }
        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;
        }