/// <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 !)); }
/// <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)); }