/// <inheritdoc cref="IParameter.CalculateAsync"/>
        /// <remarks>
        /// This implementation calls <see cref="ParameterValueBase{T}(IParameterLink, T)"/> constructor.
        /// </remarks>
        private async Task <IParameterValue> CalculateInternalAsync()
        {
            TValue value;

            try
            {
                value = await CalculateValueAsync();
            }
            catch (Exception exception)
                when(exception
                     is ParameterValueCalculationException
                     or RemoteAgentAccessException)
                {
                    logger.LogError(exception, $"Failed to calculate value of parameter '{Name}'.");
                    return(NullValue.OfParameter(this));
                }

            return(Activator
                   .CreateInstance(typeof(TParameterValue), this.GetLink(), value)
                   .To(instance => (IParameterValue)instance !));
        }
Beispiel #2
0
        /// <summary>
        /// Calculate parameter <paramref name="parameterToCalculate"/> with all its' dependencies.
        /// </summary>
        private async ValueTask <IParameterValue> CalculateWithDependencies(IParameter parameterToCalculate)
        {
            var dependenciesValues = await DependenciesValues(parameterToCalculate).ToArrayAsync();

            var notCalculated = dependenciesValues
                                .OfType <NullValue>()
                                .Cast <IParameterValue>()
                                .ToImmutableArray();

            if (!notCalculated.Any())
            {
                dependenciesValues.ForEach(pgSettings.Apply);
                return(await parameterToCalculate.CalculateAsync());
            }

            var parameterNames = notCalculated.Select(value => value.Link.Name);

            logger.LogWarning(
                $"Unable to calculate value of parameter '{parameterToCalculate.Name}' " +
                $"because it has dependencies which are not calculated: [{parameterNames.JoinBy(", ")}].");
            return(NullValue.OfParameter(parameterToCalculate));
        }