Exemplo n.º 1
0
        private Expression CreateResolveExpressionRecursively(TypeKey requestedTypeKey, DependencyInjectionContainer container, DependencyOverrides dependencyOverrides, bool?tryResolveAll = null)
        {
            // Check if the instance is overridden
            if (dependencyOverrides?.HasOverriddenInstance(requestedTypeKey) == true)
            {
                return(Expression.Convert(Expression.Call(Expression.Call(Constants.ResolveContextParameterExpression, Constants.GetDependencyOverridesProperty),
                                                          Constants.GetOverriddenInstanceMethod,
                                                          Expression.Constant(requestedTypeKey)),
                                          requestedTypeKey.Type));
            }

            // Else ask the container for a ResolveInfo to identify how the returned expression should be composed
            var resolveInfo = container.GetResolveInfo(requestedTypeKey, tryResolveAll);

            if (resolveInfo is ResolveRegistrationInfo resolveRegistrationInfo)
            {
                return(CreateResolveExpressionRecursively(requestedTypeKey, resolveRegistrationInfo.Registration, dependencyOverrides, container));
            }
            if (resolveInfo is ResolveAllInfo resolveAllInfo)
            {
                return(CreateResolveAllExpressionRecursively(resolveAllInfo, dependencyOverrides, container));
            }

            throw new InvalidOperationException($"Cannot handle ResolveInfo \"{resolveInfo}\" in this current implementation of \"{nameof(CompiledLinqExpressionFactory)}\"");
        }