private static async Task <Tuple <object[], IDelayedException> > PrepareParametersAsync(IReadOnlyList <string> parameterNames, IReadOnlyDictionary <string, IValueProvider> parameters) { object[] reflectionParameters = new object[parameterNames.Count]; List <Exception> bindingExceptions = new List <Exception>(); for (int index = 0; index < parameterNames.Count; index++) { string name = parameterNames[index]; IValueProvider provider = parameters[name]; BindingExceptionValueProvider exceptionProvider = provider as BindingExceptionValueProvider; if (exceptionProvider != null) { bindingExceptions.Add(exceptionProvider.Exception); } reflectionParameters[index] = await parameters[name].GetValueAsync(); } IDelayedException delayedBindingException = null; if (bindingExceptions.Count == 1) { delayedBindingException = new DelayedException(bindingExceptions[0]); } else if (bindingExceptions.Count > 1) { delayedBindingException = new DelayedException(new AggregateException(bindingExceptions)); } return(new Tuple <object[], IDelayedException>(reflectionParameters, delayedBindingException)); }
public async Task <IReadOnlyDictionary <string, IValueProvider> > BindAsync(ValueBindingContext context, TTriggerValue value) { Dictionary <string, IValueProvider> results = new Dictionary <string, IValueProvider>(); IValueProvider triggerProvider; IReadOnlyDictionary <string, object> bindingData; try { ITriggerData triggerData = await _triggerBinding.BindAsync(value, context); triggerProvider = triggerData.ValueProvider; bindingData = triggerData.BindingData; } catch (OperationCanceledException) { throw; } catch (Exception exception) { triggerProvider = new BindingExceptionValueProvider(_triggerParameterName, exception); bindingData = null; } results.Add(_triggerParameterName, triggerProvider); BindingContext bindingContext = new BindingContext(context, bindingData); foreach (KeyValuePair <string, IBinding> item in _nonTriggerBindings) { string name = item.Key; IBinding binding = item.Value; IValueProvider valueProvider; try { valueProvider = await binding.BindAsync(bindingContext); } catch (OperationCanceledException) { throw; } catch (Exception exception) { valueProvider = new BindingExceptionValueProvider(name, exception); } results.Add(name, valueProvider); } return(results); }
private static object[] PrepareParameters(IReadOnlyList <string> parameterNames, IReadOnlyDictionary <string, IValueProvider> parameters, out IDelayedException delayedBindingException) { object[] reflectionParameters = new object[parameterNames.Count]; List <Exception> bindingExceptions = new List <Exception>(); for (int index = 0; index < parameterNames.Count; index++) { string name = parameterNames[index]; IValueProvider provider = parameters[name]; BindingExceptionValueProvider exceptionProvider = provider as BindingExceptionValueProvider; if (exceptionProvider != null) { bindingExceptions.Add(exceptionProvider.Exception); } reflectionParameters[index] = parameters[name].GetValue(); } if (bindingExceptions.Count == 0) { delayedBindingException = null; } else if (bindingExceptions.Count == 1) { delayedBindingException = new DelayedException(bindingExceptions[0]); } else { delayedBindingException = new DelayedException(new AggregateException(bindingExceptions)); } return(reflectionParameters); }
private async Task <IReadOnlyDictionary <string, IValueProvider> > BindCoreAsync(ValueBindingContext context, object value, IDictionary <string, object> parameters) { Dictionary <string, IValueProvider> valueProviders = new Dictionary <string, IValueProvider>(); IValueProvider triggerProvider; IReadOnlyDictionary <string, object> bindingData; try { ITriggerData triggerData = await _triggerBinding.BindAsync(value, context); triggerProvider = triggerData.ValueProvider; bindingData = triggerData.BindingData; } catch (OperationCanceledException) { throw; } catch (Exception exception) { triggerProvider = new BindingExceptionValueProvider(_triggerParameterName, exception); bindingData = null; } valueProviders.Add(_triggerParameterName, triggerProvider); BindingContext bindingContext = FunctionBinding.NewBindingContext(context, bindingData, parameters); // Bind Singleton if specified SingletonAttribute singletonAttribute = SingletonManager.GetFunctionSingletonOrNull(_descriptor.Method, isTriggered: true); if (singletonAttribute != null) { string boundScopeId = _singletonManager.GetBoundScopeId(singletonAttribute.ScopeId, bindingData); IValueProvider singletonValueProvider = new SingletonValueProvider(_descriptor.Method, boundScopeId, context.FunctionInstanceId.ToString(), singletonAttribute, _singletonManager); valueProviders.Add(SingletonValueProvider.SingletonParameterName, singletonValueProvider); } foreach (KeyValuePair <string, IBinding> item in _nonTriggerBindings) { string name = item.Key; IBinding binding = item.Value; IValueProvider valueProvider; try { if (parameters != null && parameters.ContainsKey(name)) { valueProvider = await binding.BindAsync(parameters[name], context); } else { valueProvider = await binding.BindAsync(bindingContext); } } catch (OperationCanceledException) { throw; } catch (Exception exception) { valueProvider = new BindingExceptionValueProvider(name, exception); } valueProviders.Add(name, valueProvider); } return(valueProviders); }
public async Task <IReadOnlyDictionary <string, IValueProvider> > BindAsync(ValueBindingContext context, IDictionary <string, object> parameters) { Dictionary <string, IValueProvider> results = new Dictionary <string, IValueProvider>(); if (parameters == null || !parameters.ContainsKey(_triggerParameterName)) { throw new InvalidOperationException( "Missing value for trigger parameter '" + _triggerParameterName + "'."); } object triggerValue = parameters[_triggerParameterName]; IValueProvider triggerProvider; IReadOnlyDictionary <string, object> bindingData; try { ITriggerData triggerData = await _triggerBinding.BindAsync(triggerValue, context); triggerProvider = triggerData.ValueProvider; bindingData = triggerData.BindingData; } catch (OperationCanceledException) { throw; } catch (Exception exception) { triggerProvider = new BindingExceptionValueProvider(_triggerParameterName, exception); bindingData = null; } results.Add(_triggerParameterName, triggerProvider); BindingContext bindingContext = new BindingContext(context, bindingData); foreach (KeyValuePair <string, IBinding> item in _nonTriggerBindings) { string name = item.Key; IBinding binding = item.Value; IValueProvider valueProvider; try { if (parameters != null && parameters.ContainsKey(name)) { valueProvider = await binding.BindAsync(parameters[name], context); } else { valueProvider = await binding.BindAsync(bindingContext); } } catch (OperationCanceledException) { throw; } catch (Exception exception) { valueProvider = new BindingExceptionValueProvider(name, exception); } results.Add(name, valueProvider); } return(results); }
private async Task <IReadOnlyDictionary <string, IValueProvider> > BindCoreAsync(ValueBindingContext context, object value, IDictionary <string, object> parameters) { Dictionary <string, IValueProvider> valueProviders = new Dictionary <string, IValueProvider>(); IValueProvider triggerProvider; IReadOnlyDictionary <string, object> bindingData; IValueBinder triggerReturnValueProvider = null; try { ITriggerData triggerData = await _triggerBinding.BindAsync(value, context); triggerProvider = triggerData.ValueProvider; bindingData = triggerData.BindingData; triggerReturnValueProvider = (triggerData as TriggerData)?.ReturnValueProvider; } catch (OperationCanceledException) { throw; } catch (Exception exception) { triggerProvider = new BindingExceptionValueProvider(_triggerParameterName, exception); bindingData = null; } valueProviders.Add(_triggerParameterName, triggerProvider); // Bind Singleton if specified SingletonAttribute singletonAttribute = SingletonManager.GetFunctionSingletonOrNull(_descriptor, isTriggered: true); if (singletonAttribute != null) { string boundScopeId = _singletonManager.GetBoundScopeId(singletonAttribute.ScopeId, bindingData); IValueProvider singletonValueProvider = new SingletonValueProvider(_descriptor, boundScopeId, context.FunctionInstanceId.ToString(), singletonAttribute, _singletonManager); valueProviders.Add(SingletonValueProvider.SingletonParameterName, singletonValueProvider); } BindingContext bindingContext = FunctionBinding.NewBindingContext(context, bindingData, parameters); foreach (KeyValuePair <string, IBinding> item in _nonTriggerBindings) { string name = item.Key; IBinding binding = item.Value; IValueProvider valueProvider; try { if (parameters != null && parameters.ContainsKey(name)) { valueProvider = await binding.BindAsync(parameters[name], context); } else { valueProvider = await binding.BindAsync(bindingContext); } } catch (OperationCanceledException) { throw; } catch (Exception exception) { valueProvider = new BindingExceptionValueProvider(name, exception); } valueProviders.Add(name, valueProvider); } // Triggers can optionally process the return values of functions. They do so by declaring // a "$return" key in their binding data dictionary and mapping it to an IValueBinder. // An explicit return binding takes precedence over an implicit trigger binding. if (!valueProviders.ContainsKey(FunctionIndexer.ReturnParamName)) { if (triggerReturnValueProvider != null) { valueProviders.Add(FunctionIndexer.ReturnParamName, triggerReturnValueProvider); } } return(valueProviders); }