public static void RegisterBindingRules(JobHostConfiguration hostConfig)
            {
                IConverterManager cm = hostConfig.ConverterManager;

                cm.AddConverter <DurableActivityContext, string>(ActivityContextToString);
                cm.AddConverter <DurableActivityContext, JObject>(ActivityContextToJObject);
            }
예제 #2
0
 public static IConverterManager AddNotificationHubConverters(this IConverterManager converterManager)
 {
     converterManager.AddConverter <TemplateNotification, Notification>(templateNotification => templateNotification);
     converterManager.AddConverter <string, Notification>(messageProperties => BuildTemplateNotificationFromJsonString(messageProperties));
     converterManager.AddConverter <IDictionary <string, string>, Notification>(messageProperties => BuildTemplateNotificationFromDictionary(messageProperties));
     return(converterManager);
 }
        void IExtensionConfigProvider.Initialize(ExtensionConfigContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            // Deferred list
            foreach (var action in _deferredWork)
            {
                action(context.Config);
            }
            _deferredWork.Clear();

            // get the services we need to construct our binding providers
            INameResolver      nameResolver = context.Config.NameResolver;
            IExtensionRegistry extensions   = context.Config.GetService <IExtensionRegistry>();

            IConverterManager cm = context.Config.GetService <IConverterManager>();

            cm.AddConverter <string, EventData>(ConvertString2EventData);
            cm.AddConverter <EventData, string>(ConvertEventData2String);
            cm.AddConverter <byte[], EventData>(ConvertBytes2EventData); // direct, handles non-string representations

            // register our trigger binding provider
            var triggerBindingProvider = new EventHubTriggerAttributeBindingProvider(nameResolver, cm, this);

            extensions.RegisterExtension <ITriggerBindingProvider>(triggerBindingProvider);

            // register our binding provider
            var bindingProvider = new EventHubAttributeBindingProvider(nameResolver, cm, this);

            extensions.RegisterExtension <IBindingProvider>(bindingProvider);
        }
예제 #4
0
        void IExtensionConfigProvider.Initialize(ExtensionConfigContext context)
        {
            INameResolver     nameResolver = context.Config.GetService <INameResolver>();
            IConverterManager cm           = context.Config.GetService <IConverterManager>();

            cm.AddConverter <string, FakeQueueData>(x => new FakeQueueData {
                Message = x
            });

            if (this.SetConverters != null)
            {
                this.SetConverters(cm);
            }

            cm.AddConverter <FakeQueueData, string>(msg => msg.Message);
            cm.AddConverter <OtherFakeQueueData, FakeQueueData>(OtherFakeQueueData.ToEvent);

            IExtensionRegistry extensions = context.Config.GetService <IExtensionRegistry>();

            var bf = new BindingFactory(nameResolver, cm);

            // Binds [FakeQueue] --> IAsyncCollector<FakeQueueData>
            var ruleOutput = bf.BindToAsyncCollector <FakeQueueAttribute, FakeQueueData>(BuildFromAttr);

            // Binds [FakeQueue] --> FakeQueueClient
            var ruleClient = bf.BindToExactType <FakeQueueAttribute, FakeQueueClient>((attr) => this);

            extensions.RegisterBindingRules <FakeQueueAttribute>(ruleOutput, ruleClient);

            var triggerBindingProvider = new FakeQueueTriggerBindingProvider(this, cm);

            extensions.RegisterExtension <ITriggerBindingProvider>(triggerBindingProvider);
        }
예제 #5
0
        /// <inheritdoc />
        public void Initialize(ExtensionConfigContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            INameResolver nameResolver = context.Config.NameResolver;

            _defaultApiKey = nameResolver.Resolve(AzureWebJobsSendGridApiKeyName);

            IConverterManager converterManager = context.Config.GetService <IConverterManager>();

            converterManager.AddConverter <string, Mail>(SendGridHelpers.CreateMessage);
            converterManager.AddConverter <JObject, Mail>(SendGridHelpers.CreateMessage);

            BindingFactory   factory        = new BindingFactory(nameResolver, converterManager);
            IBindingProvider outputProvider = factory.BindToAsyncCollector <SendGridAttribute, Mail>((attr) =>
            {
                string apiKey            = FirstOrDefault(attr.ApiKey, ApiKey, _defaultApiKey);
                ISendGridClient sendGrid = _sendGridClientCache.GetOrAdd(apiKey, a => ClientFactory.Create(a));
                return(new SendGridMailAsyncCollector(this, attr, sendGrid));
            });

            IExtensionRegistry extensions = context.Config.GetService <IExtensionRegistry>();

            extensions.RegisterBindingRules <SendGridAttribute>(ValidateBinding, nameResolver, outputProvider);
        }
예제 #6
0
        void IExtensionConfigProvider.Initialize(ExtensionConfigContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            _defaultStorageString = context.Config.StorageConnectionString;

            // get the services we need to construct our binding providers
            INameResolver      nameResolver = context.Config.NameResolver;
            IExtensionRegistry extensions   = context.Config.GetService <IExtensionRegistry>();

            IConverterManager cm = context.Config.GetService <IConverterManager>();

            cm.AddConverter <string, EventData>(ConvertString2EventData);
            cm.AddConverter <EventData, string>(ConvertEventData2String);
            cm.AddConverter <byte[], EventData>(ConvertBytes2EventData); // direct, handles non-string representations
            cm.AddConverter <EventData, byte[]>(ConvertEventData2Bytes); // direct, handles non-string representations

            var bf = new BindingFactory(nameResolver, cm);

            // register our trigger binding provider
            var triggerBindingProvider = new EventHubTriggerAttributeBindingProvider(nameResolver, cm, this);

            extensions.RegisterExtension <ITriggerBindingProvider>(triggerBindingProvider);

            // register our binding provider
            var ruleOutput = bf.BindToAsyncCollector <EventHubAttribute, EventData>(BuildFromAttribute);

            extensions.RegisterBindingRules <EventHubAttribute>(ruleOutput);
        }
예제 #7
0
 public static void AddNotificationHubConverters(this IConverterManager converterManager)
 {
     converterManager.AddConverter <TemplateNotification, Notification>(templateNotification => templateNotification);
     converterManager.AddConverter <string, Notification>(messageProperties => BuildTemplateNotificationFromJsonString(messageProperties));
     converterManager.AddConverter <string, Notification, NotificationHubAttribute>((notificationAsString, notificationHubAttr) => BuildNotificationFromString(notificationAsString, notificationHubAttr.Platform));
     converterManager.AddConverter <IDictionary <string, string>, Notification>(messageProperties => BuildTemplateNotificationFromDictionary(messageProperties));
 }
예제 #8
0
            public static void RegisterBindingRules(JobHostConfiguration hostConfig)
            {
#pragma warning disable CS0618 // Type or member is obsolete
                IConverterManager cm = hostConfig.ConverterManager;
#pragma warning restore CS0618 // Type or member is obsolete
                cm.AddConverter <DurableActivityContext, string>(ActivityContextToString);
                cm.AddConverter <DurableActivityContext, JObject>(ActivityContextToJObject);
            }
            public static void RegisterBindingRules(JobHostConfiguration hostConfig)
            {
                IConverterManager cm = hostConfig.ConverterManager;

                cm.AddConverter <DurableActivityContext, string>(ActivityContextToString);
                cm.AddConverter <DurableActivityContext, JObject>(ActivityContextToJObject);

                // TODO: Add support for open types - i.e. POCO objects
            }
            public void Initialize(ExtensionConfigContext context)
            {
                if (context == null)
                {
                    throw new ArgumentNullException("context");
                }

                if (string.IsNullOrEmpty(_sendGridConfig.ApiKey))
                {
                    throw new InvalidOperationException(
                              string.Format("The SendGrid ApiKey must be set either via a '{0}' app setting, via a '{0}' environment variable, or directly in code via SendGridConfiguration.ApiKey.",
                                            SendGridConfiguration.AzureWebJobsSendGridApiKeyName));
                }
                _sendGrid = new Web(_sendGridConfig.ApiKey);

                IConverterManager converterManager = context.Config.GetService <IConverterManager>();

                converterManager.AddConverter <JObject, SendGridMessage>(SendGridHelpers.CreateMessage);

                INameResolver    nameResolver   = context.Config.GetService <INameResolver>();
                BindingFactory   factory        = new BindingFactory(nameResolver, converterManager);
                IBindingProvider outputProvider = factory.BindToAsyncCollector <SendGridAttribute, SendGridMessage>((attr) =>
                {
                    return(new SendGridMessageAsyncCollector(_sendGridConfig, attr, _sendGrid));
                });

                IExtensionRegistry extensions = context.Config.GetService <IExtensionRegistry>();

                extensions.RegisterBindingRules <SendGridAttribute>(outputProvider);
            }
예제 #11
0
        public void Initialize(ExtensionConfigContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            INameResolver nameResolver = context.Config.GetService <INameResolver>();

            _defaultAccountSid = nameResolver.Resolve(AzureWebJobsTwilioAccountSidKeyName);
            _defaultAuthToken  = nameResolver.Resolve(AzureWebJobsTwilioAccountAuthTokenName);

            IConverterManager converterManager = context.Config.GetService <IConverterManager>();

            converterManager.AddConverter <JObject, SMSMessage>(CreateSmsMessage);

            BindingFactory   factory        = new BindingFactory(nameResolver, converterManager);
            IBindingProvider outputProvider = factory.BindToAsyncCollector <TwilioSmsAttribute, SMSMessage>((attr) =>
            {
                return(new TwilioSmsMessageAsyncCollector(CreateContext(attr)));
            });

            IExtensionRegistry extensions = context.Config.GetService <IExtensionRegistry>();

            extensions.RegisterBindingRules <TwilioSmsAttribute>(ValidateBinding, nameResolver, outputProvider);
        }
        /// <summary>
        /// Register a new converter function that is influenced by the attribute.
        /// If TSource is object, then this converter is applied to any attempt to convert to TDestination.
        /// </summary>
        /// <typeparam name="TSource">Source type.</typeparam>
        /// <typeparam name="TDestination">Destination type.</typeparam>
        /// <typeparam name="TAttribute">Attribute on the binding. </typeparam>
        /// <param name="converterManager"></param>
        /// <param name="converter">A function to convert from the source to the destination type.</param>
        public static void AddConverter <TSource, TDestination, TAttribute>(this IConverterManager converterManager, Func <TSource, TAttribute, TDestination> converter)
            where TAttribute : Attribute
        {
            FuncConverter <TSource, TAttribute, TDestination> func = (src, attr, context) => converter(src, attr);

            converterManager.AddConverter(func);
        }
예제 #13
0
        void IExtensionConfigProvider.Initialize(ExtensionConfigContext context)
        {
            IConverterManager cm = context.Config.GetOrCreateConverterManager();

            cm.AddConverter <string, FakeQueueData>(x => new FakeQueueData {
                Message = x
            });
            cm.AddConverter <FakeQueueData, string>(msg => msg.Message);

            IExtensionRegistry extensions = context.Config.GetService <IExtensionRegistry>();

            var bindingProvider = new FakeQueueBindingProvider(this, cm);

            extensions.RegisterExtension <IBindingProvider>(bindingProvider);

            var triggerBindingProvider = new FakeQueueTriggerBindingProvider(this, cm);

            extensions.RegisterExtension <ITriggerBindingProvider>(triggerBindingProvider);
        }
예제 #14
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);
        }
예제 #15
0
            public void Initialize(ExtensionConfigContext context)
            {
                IExtensionRegistry extensions = context.Config.GetService <IExtensionRegistry>();
                var bf = context.Config.BindingFactory;

                // Add [Test] support
                var rule = bf.BindToExactType <TestAttribute, string>(attr => attr.Path);

                extensions.RegisterBindingRules <TestAttribute>(rule);

                // Add [FakeQueueTrigger] support.
                IConverterManager cm = context.Config.GetService <IConverterManager>();

                cm.AddConverter <string, FakeQueueData>(x => new FakeQueueData {
                    Message = x
                });
                cm.AddConverter <FakeQueueData, string>(msg => msg.Message);
                var triggerBindingProvider = new FakeQueueTriggerBindingProvider(new FakeQueueClient(), cm);

                extensions.RegisterExtension <ITriggerBindingProvider>(triggerBindingProvider);
            }
예제 #16
0
        // Helper to allocate a binding provider for [Queue].
        // private instance method since it's refering to lambdas that close over the instance fields.
        private IBindingProvider New(
            INameResolver nameResolver,
            IConverterManager converterManager)
        {
            // IStorageQueueMessage is the core testing interface
            converterManager.AddConverter <byte[], IStorageQueueMessage, QueueAttribute>(ConvertByteArrayToCloudQueueMessage);
            converterManager.AddConverter <IStorageQueueMessage, byte[]>(ConvertCloudQueueMessageToByteArray);

            converterManager.AddConverter <object, JObject, QueueAttribute>(SerializeToJobject);
            converterManager.AddConverter <string, IStorageQueueMessage, QueueAttribute>(ConvertStringToCloudQueueMessage);
            converterManager.AddConverter <IStorageQueueMessage, string>(ConvertCloudQueueMessageToString);

            converterManager.AddConverter <CloudQueueMessage, IStorageQueueMessage>(ConvertToStorageQueueMessage);

            var bindingFactory = new BindingFactory(nameResolver, converterManager);

            var bindAsyncCollector = bindingFactory.BindToCollector <QueueAttribute, IStorageQueueMessage>(BuildFromQueueAttribute)
                                     .SetPostResolveHook <QueueAttribute>(ToWriteParameterDescriptorForCollector, CollectAttributeInfo);

            var bindClient = bindingFactory.BindToInput <QueueAttribute, IStorageQueue>(typeof(QueueBuilder))
                             .SetPostResolveHook <QueueAttribute>(ToReadWriteParameterDescriptorForCollector, CollectAttributeInfo);

            var bindSdkClient = bindingFactory.BindToInput <QueueAttribute, CloudQueue>(typeof(QueueBuilder))
                                .SetPostResolveHook <QueueAttribute>(ToReadWriteParameterDescriptorForCollector, CollectAttributeInfo);

            var bindingProvider = new GenericCompositeBindingProvider <QueueAttribute>(
                ValidateQueueAttribute, nameResolver, bindClient, bindSdkClient, bindAsyncCollector);

            return(bindingProvider);
        }
        private static void AddConverterBuilder <TSource, TDestination, TAttribute>(
            this IConverterManager converterManager,
            PatternMatcher patternMatcher)
            where TAttribute : Attribute
        {
            if (converterManager == null)
            {
                throw new ArgumentNullException("converterManager");
            }

            converterManager.AddConverter <TSource, TDestination, TAttribute>((typeSource, typeDest) =>
            {
                var converter = patternMatcher.TryGetConverterFunc(typeSource, typeDest);
                return(converter);
            });
        }
            public void Initialize(ExtensionConfigContext context)
            {
                if (context == null)
                {
                    throw new ArgumentNullException("context");
                }

                // Register our extension binding providers
                context.Config.RegisterBindingExtensions(
                    new SampleAttributeBindingProvider(),
                    new SampleTriggerAttributeBindingProvider());

                IConverterManager converterManager = context.Config.GetService <IConverterManager>();

                converterManager.AddConverter <CloudTable, Table <OpenType>, TableAttribute>(typeof(CustomTableBindingConverter <>));
            }
예제 #19
0
        public void Table_IfBoundToCustomTableBindingExtension_BindsCorrectly()
        {
            // Arrange
            IStorageAccount account = CreateFakeStorageAccount();

            var config = TestHelpers.NewConfig(typeof(CustomTableBindingExtensionProgram), account);

            IConverterManager cm = config.GetService <IConverterManager>();

            // Add a rule for binding CloudTable --> CustomTableBinding<TEntity>
            cm.AddConverter <CloudTable, CustomTableBinding <OpenType>, TableAttribute>(
                typeof(CustomTableBindingConverter <>));

            var host = new TestJobHost <CustomTableBindingExtensionProgram>(config);

            host.Call("Run"); // Act

            // Assert
            Assert.Equal(TableName, CustomTableBinding <Poco> .Table.Name);
            Assert.True(CustomTableBinding <Poco> .AddInvoked);
            Assert.True(CustomTableBinding <Poco> .DeleteInvoked);
        }
예제 #20
0
            public void Initialize(ExtensionConfigContext context)
            {
                _messageEnqueuedWatcherGetter = context.PerHostServices.GetService <ContextAccessor <IMessageEnqueuedWatcher> >();
                _accountProvider = context.Config.GetService <IStorageAccountProvider>();

                context.ApplyConfig(context.Config.Queues, "queues");

                // IStorageQueueMessage is the core testing interface
                var binding = context.AddBindingRule <QueueAttribute>();

                binding
                .AddConverter <byte[], IStorageQueueMessage>(ConvertByteArrayToCloudQueueMessage)
                .AddConverter <string, IStorageQueueMessage>(ConvertStringToCloudQueueMessage);

                context   // global converters, apply to multiple attributes.
                .AddConverter <IStorageQueueMessage, byte[]>(ConvertCloudQueueMessageToByteArray)
                .AddConverter <IStorageQueueMessage, string>(ConvertCloudQueueMessageToString)
                .AddConverter <CloudQueueMessage, IStorageQueueMessage>(ConvertToStorageQueueMessage);

                var builder = new QueueBuilder(this);

                binding.AddValidator(ValidateQueueAttribute)
                .SetPostResolveHook(ToWriteParameterDescriptorForCollector)
                .BindToCollector <IStorageQueueMessage>(BuildFromQueueAttribute);

                binding.SetPostResolveHook(ToReadWriteParameterDescriptorForCollector)
                .BindToInput <IStorageQueue>(builder);

                binding.SetPostResolveHook(ToReadWriteParameterDescriptorForCollector)
                .BindToInput <CloudQueue>(builder);

                binding.SetPostResolveHook(ToReadWriteParameterDescriptorForCollector)
                .BindToInput <CloudQueue>(builder);

                IConverterManager converterManager = context.Config.ConverterManager;

                converterManager.AddConverter <object, JObject, QueueAttribute>(SerializeToJobject);
            }
예제 #21
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);
        }
예제 #22
0
 static void AddItem2ByteConverter(IConverterManager cm)
 {
     cm.AddConverter <FakeQueueData, byte>(msg => msg.Byte);
 }
예제 #23
0
 static void AddItem2ByteArrayConverter(IConverterManager cm)
 {
     cm.AddConverter <FakeQueueData, byte[]>(msg => System.Text.Encoding.UTF8.GetBytes(msg.Message));
 }