private void GenerateBaseExpression(ServiceBinding serviceBinding, CircularDependencyDetector circularDependencyDetector) { if (serviceBinding.BaseExpression == null) { lock (serviceBinding) { if (serviceBinding.BaseExpression == null) { ParameterExpression[] parameters = serviceBinding.Expression.GetParameterExpressions().Where(x => x.Type != ExpressionGenerator.ScopeParameter.Type).ToArray(); var factories = new InstanceFactory[parameters.Length]; for (var i = 0; i < parameters.Length; i++) { ParameterExpression parameter = parameters[i]; ServiceBinding child = GetDependency(parameter.Type).Default; factories[i] = ResolveDependency(parameter.Type, child, circularDependencyDetector); } if (serviceBinding.ResolveError != null) { throw serviceBinding.ResolveError; } serviceBinding.BaseExpression = _expressionGenerator.GenerateBaseExpression(serviceBinding, factories, _containerScope, _settings); } } } }
private void GenerateBaseExpression(ServiceBinding serviceBinding, CircularDependencyDetector circularDependencyDetector) { if (serviceBinding.BaseExpression == null) { lock (serviceBinding) { if (serviceBinding.BaseExpression == null) { if (serviceBinding.Expression == null) { var constructor = serviceBinding.ConstructorResolver.DynamicSelectConstructor(serviceBinding.ConcreteType, this); serviceBinding.Expression = serviceBinding.ConcreteType.ResolveConstructorExpression(constructor); } ParameterExpression[] parameters = serviceBinding.Expression.GetParameterExpressions().Where(x => x.Type != ExpressionGenerator.ScopeParameter.Type).ToArray(); var factories = new InstanceFactory[parameters.Length]; for (var i = 0; i < parameters.Length; i++) { ParameterExpression parameter = parameters[i]; ServiceBinding child = GetDependency(parameter.Type).Default; InstanceFactory? factory = TryResolveDependency(parameter.Type, child, circularDependencyDetector); factories[i] = factory ?? throw (child.ResolveError ?? throw new NotImplementedException()); } serviceBinding.BaseExpression = _expressionGenerator.GenerateBaseExpression(serviceBinding, factories, _containerScope, Settings); } } } }
private void GenerateBaseExpression(ServiceBinding serviceBinding, CircularDependencyDetector circularDependencyDetector) { if (serviceBinding.BaseExpression == null) { lock (serviceBinding) { if (serviceBinding.BaseExpression == null) { if (serviceBinding.Expression == null) { var constructor = serviceBinding.ConstructorResolver.DynamicSelectConstructor(serviceBinding.ConcreteType, this); serviceBinding.Expression = serviceBinding.ConcreteType.ResolveConstructorExpression(constructor); } ParameterExpression[] parameters = serviceBinding.Expression.GetParameterExpressions().Where(x => x.Type != ExpressionGenerator.ScopeParameter.Type).ToArray(); InstanceFactory[] factories = ResolveParameters(parameters, circularDependencyDetector); serviceBinding.BaseExpression = _expressionGenerator.GenerateBaseExpression(serviceBinding, factories, _containerScope, Settings); } } } }