コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }