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)); }
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]); }
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()); }
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); }