Ejemplo n.º 1
0
        /// <inheritdoc />
        public bool TryBuildExpression(IBuildContext buildContext, ILifetime lifetime, out Expression expression, out Exception error)
        {
            if (buildContext == null)
            {
                throw new ArgumentNullException(nameof(buildContext));
            }
            try
            {
                var autoWiringStrategy = _autowiringStrategy ?? buildContext.AutowiringStrategy;
                var typeDescriptor     = _createInstanceExpression.Type.Descriptor();
                expression = ReplaceTypes(buildContext, _createInstanceExpression, _typesMap);
                var thisVar = Expression.Variable(expression.Type);

                var initializeExpressions =
                    GetInitializers(buildContext.Container, autoWiringStrategy, typeDescriptor)
                    .Select(initializer => (Expression)Expression.Call(thisVar, initializer.Info, initializer.GetParametersExpressions(buildContext)))
                    .Concat(_initializeInstanceExpressions.Select(statementExpression => ReplaceTypes(buildContext, statementExpression, _typesMap)))
                    .ToArray();

                if (initializeExpressions.Length > 0)
                {
                    expression = Expression.Block(
                        new[] { thisVar },
                        Expression.Assign(thisVar, expression),
                        Expression.Block(initializeExpressions),
                        thisVar
                        );
                }

                var visitor = new DependencyInjectionExpressionVisitor(buildContext, thisVar);
                expression = visitor.Visit(expression) ?? expression;
                expression = buildContext.FinalizeExpression(expression, lifetime);
                error      = default(Exception);
                return(true);
            }
            catch (BuildExpressionException ex)
            {
                error      = ex;
                expression = default(Expression);
                return(false);
            }
        }