public async Task<ITriggerData> BindAsync(object value, ValueBindingContext context)
{
HttpRequestMessage request = value as HttpRequestMessage;
if (request == null)
{
throw new NotSupportedException("An HttpRequestMessage is required");
}
IValueProvider valueProvider = null;
object poco = null;
IReadOnlyDictionary<string, object> userTypeBindingData = null;
string invokeString = ToInvokeString(request);
if (_isUserTypeBinding)
{
valueProvider = await CreateUserTypeValueProvider(request, invokeString);
if (_bindingDataProvider != null)
{
// some binding data is defined by the user type
// the provider might be null if the Type is invalid, or if the Type
// has no public properties to bind to
poco = valueProvider.GetValue();
userTypeBindingData = _bindingDataProvider.GetBindingData(poco);
}
}
else
{
valueProvider = new HttpRequestValueBinder(_parameter, request, invokeString);
}
// create a modifiable collection of binding data and
// copy in any initial binding data from the poco
var aggregateBindingData = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
aggregateBindingData.AddRange(userTypeBindingData);
// Apply additional binding data coming from request route, query params, etc.
var requestBindingData = await GetRequestBindingDataAsync(request, _bindingDataContract);
aggregateBindingData.AddRange(requestBindingData);
// apply binding data to the user type
if (poco != null && aggregateBindingData.Count > 0)
{
ApplyBindingData(poco, aggregateBindingData);
}
return new TriggerData(valueProvider, aggregateBindingData);
}