Example #1
0
 protected DecoratorPredicateContext CreatePredicateContext(
     Type registeredServiceType, Expression expression, ServiceTypeDecoratorInfo info)
 {
     // NOTE: registeredServiceType can be different from registeredProducer.ServiceType.
     // This is the case for container-uncontrolled collections where producer.ServiceType is the
     // IEnumerable<T> and registeredServiceType is T.
     return(DecoratorPredicateContext.CreateFromInfo(registeredServiceType, expression, info));
 }
Example #2
0
        protected Registration CreateRegistration(
            Type serviceType,
            ConstructorInfo decoratorConstructor,
            Expression decorateeExpression,
            InstanceProducer realProducer,
            ServiceTypeDecoratorInfo info)
        {
            var overriddenParameters = this.CreateOverriddenParameters(
                serviceType, decoratorConstructor, decorateeExpression, realProducer, info);

            return(this.Lifestyle.CreateDecoratorRegistration(
                       decoratorConstructor.DeclaringType, this.Container, overriddenParameters));
        }
        protected ServiceTypeDecoratorInfo GetServiceTypeInfo(Expression originalExpression,
                                                              InstanceProducer registeredProducer, Func <Type, InstanceProducer> producerBuilder)
        {
            var predicateCache = this.ThreadStaticServiceTypePredicateCache;

            if (!predicateCache.ContainsKey(registeredProducer))
            {
                Type implementationType =
                    DecoratorHelpers.DetermineImplementationType(originalExpression, registeredProducer);

                var producer = producerBuilder(implementationType);

                predicateCache[registeredProducer] = new ServiceTypeDecoratorInfo(implementationType, producer);
            }

            return(predicateCache[registeredProducer]);
        }
Example #4
0
        private OverriddenParameter[] CreateOverriddenParameters(
            Type serviceType,
            ConstructorInfo decoratorConstructor,
            Expression decorateeExpression,
            InstanceProducer realProducer,
            ServiceTypeDecoratorInfo info)
        {
            ParameterInfo decorateeParameter = GetDecorateeParameter(serviceType, decoratorConstructor);

            decorateeExpression = this.GetExpressionForDecorateeDependencyParameterOrNull(
                decorateeParameter, serviceType, decorateeExpression);

            var currentProducer = info.GetCurrentInstanceProducer();

            if (DecoratorHelpers.IsDecorateeFactoryDependencyType(decorateeParameter.ParameterType, serviceType))
            {
                // Adding a verifier makes sure the graph for the decoratee gets created,
                // which allows testing whether constructing the graph fails.
                AddVerifierForDecorateeFactoryDependency(decorateeExpression, realProducer);

                // By adding the decoratee producer, we allow that object graph to be diagnosed.
                realProducer.AddProducerToVerify(currentProducer);

                currentProducer = this.CreateDecorateeFactoryProducer(decorateeParameter);
            }

            var decorateeOverriddenParameter =
                new OverriddenParameter(decorateeParameter, decorateeExpression, currentProducer);

            IEnumerable <OverriddenParameter> predicateContextOverriddenParameters =
                this.CreateOverriddenDecoratorContextParameters(decoratorConstructor, currentProducer);

            var overriddenParameters = (new[] { decorateeOverriddenParameter })
                                       .Concat(predicateContextOverriddenParameters);

            return(overriddenParameters.ToArray());
        }
        private OverriddenParameter[] CreateOverriddenParameters(Type serviceType,
                                                                 ConstructorInfo decoratorConstructor, Expression decorateeExpression,
                                                                 InstanceProducer realProducer, ServiceTypeDecoratorInfo info)
        {
            ParameterInfo decorateeParameter = GetDecorateeParameter(serviceType, decoratorConstructor);

            decorateeExpression = this.GetExpressionForDecorateeDependencyParameterOrNull(
                decorateeParameter, serviceType, decorateeExpression);

            var currentProducer = info.GetCurrentInstanceProducer();

            if (IsDecorateeFactoryDependencyParameter(decorateeParameter, serviceType))
            {
                AddVerifierForDecorateeFactoryDependency(decorateeExpression, realProducer);

                realProducer.AddProducerToVerify(currentProducer);

                currentProducer = this.CreateDecorateeFactoryProducer(decorateeParameter);
            }

            var decorateeOverriddenParameter =
                new OverriddenParameter(decorateeParameter, decorateeExpression, currentProducer);

            IEnumerable <OverriddenParameter> predicateContextOverriddenParameters =
                this.CreateOverriddenDecoratorContextParameters(decoratorConstructor, currentProducer);

            var overriddenParameters = (new[] { decorateeOverriddenParameter })
                                       .Concat(predicateContextOverriddenParameters);

            return(overriddenParameters.ToArray());
        }
Example #6
0
        protected DecoratorPredicateContext CreatePredicateContext(ExpressionBuiltEventArgs e)
        {
            ServiceTypeDecoratorInfo info = this.GetServiceTypeInfo(e);

            return(this.CreatePredicateContext(e.RegisteredServiceType, e.Expression, info));
        }
        private OverriddenParameter[] CreateOverriddenParameters(Type serviceType,
            ConstructorInfo decoratorConstructor, Expression decorateeExpression,
            InstanceProducer realProducer, ServiceTypeDecoratorInfo info)
        {
            ParameterInfo decorateeParameter = GetDecorateeParameter(serviceType, decoratorConstructor);

            decorateeExpression = this.GetExpressionForDecorateeDependencyParameterOrNull(
                decorateeParameter, serviceType, decorateeExpression);

            var currentProducer = info.GetCurrentInstanceProducer();

            if (IsDecorateeFactoryDependencyParameter(decorateeParameter, serviceType))
            {
                AddVerifierForDecorateeFactoryDependency(decorateeExpression, realProducer);

                realProducer.AddProducerToVerify(currentProducer);

                currentProducer = this.CreateDecorateeFactoryProducer(decorateeParameter);
            }

            var decorateeOverriddenParameter =
                new OverriddenParameter(decorateeParameter, decorateeExpression, currentProducer);

            IEnumerable<OverriddenParameter> predicateContextOverriddenParameters =
                this.CreateOverriddenDecoratorContextParameters(decoratorConstructor, currentProducer);

            var overriddenParameters = (new[] { decorateeOverriddenParameter })
                .Concat(predicateContextOverriddenParameters);

            return overriddenParameters.ToArray();
        }
        protected Registration CreateRegistration(Type serviceType, ConstructorInfo decoratorConstructor,
            Expression decorateeExpression, InstanceProducer realProducer, ServiceTypeDecoratorInfo info)
        {
            var overriddenParameters = this.CreateOverriddenParameters(serviceType, decoratorConstructor,
                decorateeExpression, realProducer, info);

            return this.Lifestyle.CreateRegistration(serviceType,
                decoratorConstructor.DeclaringType, this.Container,
                overriddenParameters);
        }
        protected ServiceTypeDecoratorInfo GetServiceTypeInfo(Expression originalExpression,
            InstanceProducer registeredProducer, Func<Type, InstanceProducer> producerBuilder)
        {
            var predicateCache = this.ThreadStaticServiceTypePredicateCache;

            if (!predicateCache.ContainsKey(registeredProducer))
            {
                Type implementationType =
                    DecoratorHelpers.DetermineImplementationType(originalExpression, registeredProducer);

                var producer = producerBuilder(implementationType);

                predicateCache[registeredProducer] = new ServiceTypeDecoratorInfo(implementationType, producer);
            }

            return predicateCache[registeredProducer];
        }
        internal static DecoratorPredicateContext CreateFromInfo(Type serviceType, Expression expression,
            ServiceTypeDecoratorInfo info)
        {
            var appliedDecorators = new ReadOnlyCollection<Type>(
                info.AppliedDecorators.Select(d => d.DecoratorType).ToList());

            return new DecoratorPredicateContext(serviceType, info.ImplementationType, appliedDecorators,
                expression);
        }