private InstanceFactory GenerateInstanceFactory(Type type, ServiceBinding serviceBinding, CircularDependencyDetector circularDependencyDetector) { lock (serviceBinding) { if (!serviceBinding.TryGetInstanceFactory(type, out InstanceFactory factory)) { if (serviceBinding.Expression is AbstractBindingExpression) { factory = new InstanceFactory(type, (ExpressionContext)serviceBinding.BaseExpression !, scoped => throw new AbstractTypeResolveException($"Cannot create a instance for type {type} since its registered as a abstract binding and not meant to be used directly.")); serviceBinding.Factories.Add(factory); return(factory); } Expression[] decorators = FindDecorators(type); ParameterExpression[] parameters = decorators.GetParameterExpressions().Where(x => x.Type != ExpressionGenerator.ScopeParameter.Type && x.Type != type).ToArray(); var childFactories = new InstanceFactory[parameters.Length]; for (var i = 0; i < parameters.Length; i++) { ParameterExpression parameter = parameters[i]; ServiceBinding child = GetDependency(parameter.Type).Default; childFactories[i] = ResolveDependency(parameter.Type, child, circularDependencyDetector); } ReadOnlyExpressionContext context = _expressionGenerator.ApplyDecorators(type, serviceBinding, childFactories, decorators, _containerScope); factory = new InstanceFactory(type, context); serviceBinding.Factories.Add(factory); } return(factory); } }
private InstanceFactory GenerateInstanceFactory(Type type, ServiceBinding serviceBinding, CircularDependencyDetector circularDependencyDetector) { lock (serviceBinding) { if (!serviceBinding.TryGetInstanceFactory(type, out InstanceFactory factory)) { Expression[] decorators = FindDecorators(type); ParameterExpression[] parameters = decorators.GetParameterExpressions().Where(x => x.Type != ExpressionGenerator.ScopeParameter.Type && x.Type != type).ToArray(); InstanceFactory[] factories = ResolveParameters(parameters, circularDependencyDetector); ReadOnlyExpressionContext context = _expressionGenerator.ApplyDecorators(type, serviceBinding, factories, decorators, _containerScope); factory = new InstanceFactory(type, context); serviceBinding.Factories.Add(factory); } return(factory); } }
private InstanceFactory GenerateInstanceFactory(Type type, Binding dependency, CircularDependencyDetector circularDependencyDetector) { lock (dependency) { if (!dependency.TryGetInstanceFactory(type, out InstanceFactory factory)) { Expression[] decorators = FindDecorators(type); ParameterExpression[] parameters = decorators.GetParameterExpressions().Where(x => x.Type != ExpressionGenerator.ScopeParameter.Type && x.Type != type).ToArray(); var childFactories = new InstanceFactory[parameters.Length]; for (var i = 0; i < parameters.Length; i++) { ParameterExpression parameter = parameters[i]; Binding child = GetDependency(parameter.Type).Default; childFactories[i] = ResolveDependency(parameter.Type, child, circularDependencyDetector); } Expression expression = _expressionGenerator.ApplyDecorators(type, dependency, childFactories, decorators, _containerScope); factory = new InstanceFactory(type, expression); dependency.Factories.Add(factory); } return(factory); } }