protected ServiceTypeDecoratorInfo GetServiceTypeInfo(Expression originalExpression, InstanceProducer registeredProducer, Func <Type, InstanceProducer> producerBuilder) { Type registeredServiceType = registeredProducer.ServiceType; var predicateCache = this.ThreadStaticServiceTypePredicateCache; if (!predicateCache.ContainsKey(registeredProducer)) { Type implementationType = ExtensionHelpers.DetermineImplementationType(originalExpression, registeredProducer); var producer = producerBuilder(implementationType); predicateCache[registeredProducer] = new ServiceTypeDecoratorInfo(registeredServiceType, 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 (IsDecorateeFactoryDependencyParameter(decorateeParameter, serviceType)) { AddVerifierForDecorateeFactoryDependency(decorateeExpression, realProducer); 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)); }