public static IBindingProvider Build(INameResolver nameResolver, IConverterManager converterManager, IStorageAccountProvider accountProvider, IExtensionRegistry extensions) { var original = new TableAttributeBindingProvider(nameResolver, accountProvider, extensions); converterManager.AddConverter <JObject, ITableEntity, TableAttribute>(original.JObjectToTableEntityConverterFunc); converterManager.AddConverter <object, ITableEntity, TableAttribute>(typeof(ObjectToITableEntityConverter <>)); // IStorageTable --> IQueryable<ITableEntity> converterManager.AddConverter <IStorageTable, IQueryable <OpenType>, TableAttribute>(typeof(TableToIQueryableConverter <>)); var bindingFactory = new BindingFactory(nameResolver, converterManager); // Includes converter manager, which provides access to IQueryable<ITableEntity> var bindToExactCloudTable = bindingFactory.BindToInput <TableAttribute, CloudTable>(typeof(JObjectBuilder)) .SetPostResolveHook <TableAttribute>(original.ToParameterDescriptorForCollector, original.CollectAttributeInfo); var bindToExactTestCloudTable = bindingFactory.BindToInput <TableAttribute, IStorageTable>(typeof(JObjectBuilder)) .SetPostResolveHook <TableAttribute>(original.ToParameterDescriptorForCollector, original.CollectAttributeInfo); var bindAsyncCollector = bindingFactory.BindToCollector <TableAttribute, ITableEntity>(original.BuildFromTableAttribute) .SetPostResolveHook <TableAttribute>(null, original.CollectAttributeInfo); var bindToJobject = bindingFactory.BindToInput <TableAttribute, JObject>(typeof(JObjectBuilder)) .SetPostResolveHook <TableAttribute>(null, original.CollectAttributeInfo); var bindToJArray = bindingFactory.BindToInput <TableAttribute, JArray>(typeof(JObjectBuilder)) .SetPostResolveHook <TableAttribute>(null, original.CollectAttributeInfo); var bindingProvider = new GenericCompositeBindingProvider <TableAttribute>( ValidateAttribute, nameResolver, new IBindingProvider[] { bindAsyncCollector, AllowMultipleRows(bindingFactory, bindToExactCloudTable), AllowMultipleRows(bindingFactory, bindToExactTestCloudTable), bindToJArray, bindToJobject, original }); return(bindingProvider); }
public void Initialize(ExtensionConfigContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } var config = context.Config; _accountProvider = config.GetService <IStorageAccountProvider>(); var nameResolver = config.NameResolver; // rules for single entity. var original = new TableAttributeBindingProvider(nameResolver, _accountProvider); var builder = new JObjectBuilder(this); var binding = context.AddBindingRule <TableAttribute>(); binding.AddValidator(ValidateAttribute) .AddConverter <JObject, ITableEntity>(JObjectToTableEntityConverterFunc) .AddConverter <object, ITableEntity>(typeof(ObjectToITableEntityConverter <>)) .AddConverter <IStorageTable, IQueryable <OpenType> >(typeof(TableToIQueryableConverter <>)); binding.WhenIsNull(RowKeyProperty) .SetPostResolveHook(ToParameterDescriptorForCollector) .BindToInput <CloudTable>(builder); binding.WhenIsNull(RowKeyProperty) .SetPostResolveHook(ToParameterDescriptorForCollector) .BindToInput <IStorageTable>(builder); binding.BindToCollector <ITableEntity>(BuildFromTableAttribute); binding.WhenIsNotNull(PartitionKeyProperty).WhenIsNotNull(RowKeyProperty) .BindToInput <JObject>(builder); binding.BindToInput <JArray>(builder); binding.Bind(original); }
public static IBindingProvider Build(INameResolver nameResolver, IConverterManager converterManager, IStorageAccountProvider accountProvider, IExtensionRegistry extensions) { var original = new TableAttributeBindingProvider(nameResolver, accountProvider, extensions); converterManager.AddConverter <JObject, ITableEntity, TableAttribute>(original.JObjectToTableEntityConverterFunc); var bindingFactory = new BindingFactory(nameResolver, converterManager); var bindAsyncCollector = bindingFactory.BindToAsyncCollector <TableAttribute, ITableEntity>(original.BuildFromTableAttribute, null, original.CollectAttributeInfo); var bindToJobject = bindingFactory.BindToExactAsyncType <TableAttribute, JObject>(original.BuildJObject, null, original.CollectAttributeInfo); var bindToJArray = bindingFactory.BindToExactAsyncType <TableAttribute, JArray>(original.BuildJArray, null, original.CollectAttributeInfo); // Filter to just support JObject, and use legacy bindings for everything else. // Once we have ITableEntity converters for pocos, we can remove the filter. // https://github.com/Azure/azure-webjobs-sdk/issues/887 bindAsyncCollector = bindingFactory.AddFilter <TableAttribute>( (attr, type) => (type == typeof(IAsyncCollector <JObject>) || type == typeof(ICollector <JObject>)), bindAsyncCollector); var bindingProvider = new GenericCompositeBindingProvider <TableAttribute>( new IBindingProvider[] { bindToJArray, bindToJobject, bindAsyncCollector, original }); return(bindingProvider); }