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);
     }
 }
        public static LambdaExpression CreateLambda <T>(ReadOnlyExpressionContext context)
        {
            Expression expression = ExpressionCompiler.OptimizeExpression(context);

            return(Expression.Lambda <Func <T> >(expression));
        }
 /// <summary>
 /// Creates a new <see cref="InstanceFactory"/>
 /// </summary>
 /// <param name="serviceType"></param>
 /// <param name="context"></param>
 /// <param name="factory"></param>
 public InstanceFactory(Type serviceType, ReadOnlyExpressionContext context, Func <Scoped, object>?factory = null)
 {
     ServiceType = serviceType;
     Context     = context;
     _factory    = factory;
 }
 public InstanceFactory(Type dependencyType, ReadOnlyExpressionContext context, Func <Scoped, object>?factory = null)
 {
     DependencyType = dependencyType;
     Context        = context;
     _factory       = factory;
 }