public void TryCreate_DelegatesToExtensions() { DefaultExtensionRegistry extensions = new DefaultExtensionRegistry(); TableArgumentBindingExtensionProvider provider = new TableArgumentBindingExtensionProvider(extensions); // before binding extensions are registered for these types, // the provider returns null Assert.Null(provider.TryCreate(_parameters[0])); Assert.Null(provider.TryCreate(_parameters[1])); Assert.Null(provider.TryCreate(_parameters[2])); // register the binding extensions FooBarTableArgumentBindingProvider fooBarExtensionProvider = new FooBarTableArgumentBindingProvider(); BazTableArgumentBindingProvider bazExtensionProvider = new BazTableArgumentBindingProvider(); extensions.RegisterExtension <IArgumentBindingProvider <ITableArgumentBinding> >(fooBarExtensionProvider); extensions.RegisterExtension <IArgumentBindingProvider <ITableArgumentBinding> >(bazExtensionProvider); provider = new TableArgumentBindingExtensionProvider(extensions); IStorageTableArgumentBinding binding = provider.TryCreate(_parameters[0]); Assert.Same(typeof(IFoo), binding.ValueType); binding = provider.TryCreate(_parameters[1]); Assert.Same(typeof(IBar), binding.ValueType); binding = provider.TryCreate(_parameters[2]); Assert.Same(typeof(IBaz), binding.ValueType); }
public async Task <IBinding> TryCreateAsync(BindingProviderContext context) { ParameterInfo parameter = context.Parameter; TableAttribute tableAttribute = parameter.GetCustomAttribute <TableAttribute>(inherit: false); if (tableAttribute == null) { return(null); } string tableName = Resolve(tableAttribute.TableName); IStorageAccount account = await _accountProvider.GetStorageAccountAsync(context.Parameter, context.CancellationToken, _nameResolver); // requires storage account with table support account.AssertTypeOneOf(StorageAccountType.GeneralPurpose); StorageClientFactoryContext clientFactoryContext = new StorageClientFactoryContext { Parameter = context.Parameter }; IStorageTableClient client = account.CreateTableClient(clientFactoryContext); bool bindsToEntireTable = tableAttribute.RowKey == null; IBinding binding; if (bindsToEntireTable) { IBindableTablePath path = BindableTablePath.Create(tableName); path.ValidateContractCompatibility(context.BindingDataContract); IStorageTableArgumentBinding argumentBinding = _tableBindingProvider.TryCreate(parameter); if (argumentBinding == null) { throw new InvalidOperationException("Can't bind Table to type '" + parameter.ParameterType + "'."); } binding = new TableBinding(parameter.Name, argumentBinding, client, path); } else { string partitionKey = Resolve(tableAttribute.PartitionKey); string rowKey = Resolve(tableAttribute.RowKey); IBindableTableEntityPath path = BindableTableEntityPath.Create(tableName, partitionKey, rowKey); path.ValidateContractCompatibility(context.BindingDataContract); IArgumentBinding <TableEntityContext> argumentBinding = _entityBindingProvider.TryCreate(parameter); if (argumentBinding == null) { throw new InvalidOperationException("Can't bind Table entity to type '" + parameter.ParameterType + "'."); } binding = new TableEntityBinding(parameter.Name, argumentBinding, client, path); } return(binding); }
public TableBinding(string parameterName, IStorageTableArgumentBinding argumentBinding, IStorageTableClient client, IBindableTablePath path) { _parameterName = parameterName; _argumentBinding = argumentBinding; _client = client; _accountName = TableClient.GetAccountName(client); _path = path; _converter = CreateConverter(client, path); }
public IStorageTableArgumentBinding TryCreate(ParameterInfo parameter) { foreach (IStorageTableArgumentBindingProvider provider in _providers) { IStorageTableArgumentBinding binding = provider.TryCreate(parameter); if (binding != null) { return(binding); } } return(null); }
public async Task TryCreate_ReturnsTableArgumentBindingExtensionWrapper() { DefaultExtensionRegistry extensions = new DefaultExtensionRegistry(); FooBarTableArgumentBindingProvider fooBarExtensionProvider = new FooBarTableArgumentBindingProvider(); extensions.RegisterExtension <IArgumentBindingProvider <ITableArgumentBinding> >(fooBarExtensionProvider); TableArgumentBindingExtensionProvider provider = new TableArgumentBindingExtensionProvider(extensions); IStorageTableArgumentBinding binding = provider.TryCreate(_parameters[0]); Assert.Equal(typeof(TableArgumentBindingExtensionProvider.TableArgumentBindingExtension), binding.GetType()); Assert.Null(BoundTable); CloudTable table = new CloudTable(new Uri("http://localhost:10000/test/table")); IStorageTable storageTable = new StorageTable(table); FunctionBindingContext functionContext = new FunctionBindingContext(Guid.NewGuid(), CancellationToken.None, new StringWriter()); ValueBindingContext context = new ValueBindingContext(functionContext, CancellationToken.None); IValueProvider valueProvider = await binding.BindAsync(storageTable, context); Assert.NotNull(valueProvider); Assert.Same(table, BoundTable); }