/// <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);
        }
Пример #2
0
        void IExtensionConfigProvider.Initialize(ExtensionConfigContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            // apply at eventProcessorOptions level (maxBatchSize, prefetchCount)
            context.ApplyConfig(_options, "eventHub");

            // apply at config level (batchCheckpointFrequency)
            context.ApplyConfig(this, "eventHub");

            _defaultStorageString = context.Config.StorageConnectionString;

            context
            .AddConverter <string, EventData>(ConvertString2EventData)
            .AddConverter <EventData, string>(ConvertEventData2String)
            .AddConverter <byte[], EventData>(ConvertBytes2EventData)
            .AddConverter <EventData, byte[]>(ConvertEventData2Bytes)
            .AddOpenConverter <OpenType.Poco, EventData>(ConvertPocoToEventData);

            // register our trigger binding provider
            INameResolver     nameResolver = context.Config.NameResolver;
            IConverterManager cm           = context.Config.GetService <IConverterManager>();
            var triggerBindingProvider     = new EventHubTriggerAttributeBindingProvider(nameResolver, cm, this, context.Config.LoggerFactory);

            context.AddBindingRule <EventHubTriggerAttribute>()
            .BindToTrigger(triggerBindingProvider);

            // register our binding provider
            context.AddBindingRule <EventHubAttribute>()
            .BindToCollector(BuildFromAttribute);
        }
        private static bool HasConverterWorker <TAttribute, TSrc, TDest>(IConverterManager converterManager)
            where TAttribute : Attribute
        {
            var func = converterManager.GetConverter <TSrc, TDest, TAttribute>();

            return(func != null);
        }
        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);
        }
        /// <summary>
        /// Creates a binding that binds to an <see cref="IAsyncCollector{T}"/> with the specified argument type. Allows for a binding
        /// to be generated for any POCO type.
        /// </summary>
        /// <param name="parameter">The ParameterInfo for the binding</param>
        /// <param name="collectorGenericType">The generic type that must implement <see cref="IAsyncCollector{T}"/> and have a public constructor with at most one parameter.</param>
        /// <param name="collectorGenericArgumentType">The generic argument type for the <see cref="IAsyncCollector{T}"/></param>
        /// <param name="converterManager">A converter manager to pass along.</param>
        /// <param name="invokeStringBinder">A <see cref="Func{T, TContext}"/> that returns the TContext to be used by the <see cref="IAsyncCollector{T}"/></param>
        /// <returns></returns>
        public static IBinding BindGenericCollector <TContext>(ParameterInfo parameter, Type collectorGenericType, Type collectorGenericArgumentType,
                                                               IConverterManager converterManager, Func <string, TContext> invokeStringBinder)
        {
            if (collectorGenericType == null)
            {
                throw new ArgumentNullException("collectorGenericType");
            }
            if (!collectorGenericType.IsGenericTypeDefinition)
            {
                throw new ArgumentException("The parameter 'collectorGenericType' must be a generic type definition.");
            }
            if (collectorGenericType.GetInterface(typeof(IAsyncCollector <>).Name) == null)
            {
                throw new ArgumentException("The Type specified by parameter 'collectorGenericType' must implement IAsyncCollector<T>.");
            }

            Type asyncCollectorInterfaceType = typeof(IAsyncCollector <>).MakeGenericType(collectorGenericArgumentType);
            Type actualCollectorType         = collectorGenericType.MakeGenericType(collectorGenericArgumentType);

            // Create a delegate to pass as the builder func to BindCollector
            Type       funcType     = typeof(Func <, ,>).MakeGenericType(typeof(object), typeof(ValueBindingContext), asyncCollectorInterfaceType);
            MethodInfo getCollector = typeof(BindingFactory).GetMethod("GetCollector", BindingFlags.NonPublic | BindingFlags.Static)
                                      .MakeGenericMethod(actualCollectorType, collectorGenericArgumentType);
            var del = Delegate.CreateDelegate(funcType, getCollector);

            // Create the method and parameters.
            MethodInfo bindCollectorMethod = typeof(BindingFactory).GetMethod("BindCollector").MakeGenericMethod(collectorGenericArgumentType, typeof(TContext));

            object[] parameters = new object[] { parameter, converterManager, del, null, invokeStringBinder };

            return(bindCollectorMethod.Invoke(null, parameters) as IBinding);
        }
Пример #6
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);
        }
            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);
            }
Пример #8
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);
 }
Пример #9
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);
        }
        /// <inheritdoc />
        public void Initialize(ExtensionConfigContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

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

            BindingFactory factory = new BindingFactory(nameResolver, converterManager);

            IBindingProvider outputProvider = factory.BindToGenericAsyncCollector <MobileTableAttribute>(BindForOutput, ThrowIfInvalidOutputItemType);

            IBindingProvider clientProvider = factory.BindToExactType <MobileTableAttribute, IMobileServiceClient>(BindForClient);

            IBindingProvider queryProvider = factory.BindToGenericItem <MobileTableAttribute>(BindForQueryAsync);

            queryProvider = factory.AddFilter <MobileTableAttribute>(IsQueryType, queryProvider);

            IBindingProvider jObjectTableProvider = factory.BindToExactType <MobileTableAttribute, IMobileServiceTable>(BindForTable);

            IBindingProvider tableProvider = factory.BindToGenericItem <MobileTableAttribute>(BindForTableAsync);

            tableProvider = factory.AddFilter <MobileTableAttribute>(IsTableType, tableProvider);

            IBindingProvider itemProvider = factory.BindToGenericValueProvider <MobileTableAttribute>(BindForItemAsync);

            itemProvider = factory.AddFilter <MobileTableAttribute>(IsItemType, itemProvider);

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

            extensions.RegisterBindingRules <MobileTableAttribute>(ValidateMobileAppUri, nameResolver, outputProvider, clientProvider, jObjectTableProvider, queryProvider, tableProvider, itemProvider);
        }
Пример #11
0
        // Bind a T.
        private static SimpleTriggerArgumentBinding <TMessage, TTriggerValue> GetTriggerArgumentElementBinding <TMessage, TTriggerValue>(
            Type elementType,
            ITriggerBindingStrategy <TMessage, TTriggerValue> bindingStrategy,
            IConverterManager converterManager)
        {
            var argumentBinding = GetDirectTriggerBinding <TMessage, TTriggerValue>(elementType, bindingStrategy, converterManager);

            if (argumentBinding != null)
            {
                // Exact match in converter manager. Always takes precedence.
                return(argumentBinding);
            }

            if (elementType == typeof(TMessage))
            {
                return(new SimpleTriggerArgumentBinding <TMessage, TTriggerValue>(bindingStrategy, converterManager));
            }
            if (elementType == typeof(string))
            {
                return(new StringTriggerArgumentBinding <TMessage, TTriggerValue>(bindingStrategy, converterManager));
            }
            else
            {
                // Catch-all.
                // Default, assume a Poco
                return(new PocoTriggerArgumentBinding <TMessage, TTriggerValue>(bindingStrategy, converterManager, elementType));
            }
        }
Пример #12
0
 public FirebaseCloudMessageTriggerAttributeBindingProvider(INameResolver nameResolver, IConverterManager converterManager, FirebaseCloudMessagingConfiguration configuration, ILoggerFactory loggerFactory)
 {
     _nameResolver     = nameResolver;
     _converterManager = converterManager;
     _configuration    = configuration;
     _logger           = loggerFactory.CreateLogger(LogCategories.CreateTriggerCategory("FirebaseCloudMessaging"));
 }
            public static void RegisterBindingRules(JobHostConfiguration hostConfig)
            {
                IConverterManager cm = hostConfig.ConverterManager;

                cm.AddConverter <DurableActivityContext, string>(ActivityContextToString);
                cm.AddConverter <DurableActivityContext, JObject>(ActivityContextToJObject);
            }
Пример #14
0
        void IExtensionConfigProvider.Initialize(ExtensionConfigContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            _defaultStorageString = context.Config.StorageConnectionString;

            context
            .AddConverter <string, EventData>(ConvertString2EventData)
            .AddConverter <EventData, string>(ConvertEventData2String)
            .AddConverter <byte[], EventData>(ConvertBytes2EventData)
            .AddConverter <EventData, byte[]>(ConvertEventData2Bytes);

            // register our trigger binding provider
            INameResolver     nameResolver = context.Config.NameResolver;
            IConverterManager cm           = context.Config.GetService <IConverterManager>();
            var triggerBindingProvider     = new EventHubTriggerAttributeBindingProvider(nameResolver, cm, this);

            context.AddBindingRule <EventHubTriggerAttribute>()
            .BindToTrigger(triggerBindingProvider);

            // register our binding provider
            context.AddBindingRule <EventHubAttribute>()
            .BindToCollector(BuildFromAttribute);
        }
Пример #15
0
        /// <summary>
        /// Bind a  parameter to an IAsyncCollector. Use this for things that have discrete output items (like sending messages or writing table rows)
        /// This will add additional adapters to connect the user's parameter type to an IAsyncCollector.
        /// </summary>
        /// <typeparam name="TMessage">The 'core type' for the IAsyncCollector.</typeparam>
        /// <typeparam name="TTriggerValue">The type of the trigger object to pass to the listener.</typeparam>
        /// <param name="bindingStrategy">A strategy object that describes how to do the binding</param>
        /// <param name="parameter">The user's parameter being bound to</param>
        /// <param name="converterManager">The converter manager, used to convert between the user parameter's type and the underlying native types used by the trigger strategy</param>
        /// <param name="createListener">A function to create the underlying listener for this parameter</param>
        /// <returns>A trigger binding</returns>
        public static ITriggerBinding GetTriggerBinding <TMessage, TTriggerValue>(
            ITriggerBindingStrategy <TMessage, TTriggerValue> bindingStrategy,
            ParameterInfo parameter,
            IConverterManager converterManager,
            Func <ListenerFactoryContext, bool, Task <IListener> > createListener)
        {
            if (bindingStrategy == null)
            {
                throw new ArgumentNullException("bindingStrategy");
            }
            if (parameter == null)
            {
                throw new ArgumentNullException("parameter");
            }

            bool singleDispatch;
            var  argumentBinding = BindingFactoryHelpers.GetTriggerArgumentBinding(bindingStrategy, parameter, converterManager, out singleDispatch);

            var parameterDescriptor = new ParameterDescriptor
            {
                Name         = parameter.Name,
                DisplayHints = new ParameterDisplayHints
                {
                    Description = singleDispatch ? "message" : "messages"
                }
            };

            ITriggerBinding binding = new StrategyTriggerBinding <TMessage, TTriggerValue>(
                bindingStrategy, argumentBinding, createListener, parameterDescriptor, singleDispatch);

            return(binding);
        }
        private static Func <TAttribute, IValueProvider> BuildICollectorArgument <TAttribute, TMessage, TMessageSrc>(
            IConverterManager cm,
            Func <TAttribute, IAsyncCollector <TMessage> > buildFromAttribute,
            AttributeCloner <TAttribute> cloner)
            where TAttribute : Attribute
        {
            // Other
            Func <TMessageSrc, TAttribute, TMessage> convert = cm.GetConverter <TMessageSrc, TMessage, TAttribute>();

            if (convert == null)
            {
                ThrowMissingConversionError(typeof(TMessageSrc));
            }
            Func <TAttribute, IValueProvider> argumentBuilder = (attrResolved) =>
            {
                IAsyncCollector <TMessage>    raw = buildFromAttribute(attrResolved);
                IAsyncCollector <TMessageSrc> obj = new TypedAsyncCollectorAdapter <TMessageSrc, TMessage, TAttribute>(
                    raw, convert, attrResolved);
                ICollector <TMessageSrc> obj2 = new SyncAsyncCollectorAdapter <TMessageSrc>(obj);
                string invokeString           = cloner.GetInvokeString(attrResolved);
                return(new AsyncCollectorValueProvider <ICollector <TMessageSrc>, TMessage>(obj2, raw, invokeString));
            };

            return(argumentBuilder);
        }
Пример #17
0
 public JobHostMetadataProvider(IFunctionIndexProvider functionIndexProvider, IExtensionRegistry extensionRegistry, IBindingProvider bindingProvider, IConverterManager converter)
 {
     _functionIndexProvider = functionIndexProvider;
     _extensionRegistry = extensionRegistry;
     _bindingProvider = bindingProvider;
     _converter = converter;
 }
        // Bind a trigger argument to various parameter types.
        // Handles either T or T[],
        internal static ITriggerDataArgumentBinding <TTriggerValue> GetTriggerArgumentBinding <TMessage, TTriggerValue>(
            ITriggerBindingStrategy <TMessage, TTriggerValue> bindingStrategy,
            ParameterInfo parameter,
            IConverterManager converterManager,
            out bool singleDispatch)
        {
            ITriggerDataArgumentBinding <TTriggerValue> argumentBinding = null;

            if (parameter.ParameterType.IsArray)
            {
                // dispatch the entire batch in a single call.
                singleDispatch = false;

                var elementType = parameter.ParameterType.GetElementType();

                var innerArgumentBinding = GetTriggerArgumentElementBinding <TMessage, TTriggerValue>(elementType, bindingStrategy, converterManager);

                argumentBinding = new ArrayTriggerArgumentBinding <TMessage, TTriggerValue>(bindingStrategy, innerArgumentBinding, converterManager);

                return(argumentBinding);
            }
            else
            {
                // Dispatch each item one at a time
                singleDispatch = true;

                var elementType = parameter.ParameterType;
                argumentBinding = GetTriggerArgumentElementBinding <TMessage, TTriggerValue>(elementType, bindingStrategy, converterManager);
                return(argumentBinding);
            }
        }
Пример #19
0
 internal FluentBindingRule(IConfiguration configuration, INameResolver nameResolver, IConverterManager converterManager, IExtensionRegistry extensionRegistry)
 {
     _configuration     = configuration;
     _nameResolver      = nameResolver;
     _converterManager  = converterManager;
     _extensionRegistry = extensionRegistry;
 }
Пример #20
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);
        }
Пример #21
0
 public ArrayTriggerArgumentBinding(
     ITriggerBindingStrategy <TMessage, TTriggerValue> hooks,
     SimpleTriggerArgumentBinding <TMessage, TTriggerValue> innerBinding,
     IConverterManager converterManager) : base(hooks, converterManager, false)
 {
     this._innerBinding = innerBinding;
 }
            public Task <ITriggerData> BindAsync(object value, ValueBindingContext context)
            {
                IConverterManager cm = this.parent.extensionContext.Config.ConverterManager;
                MethodInfo        getConverterMethod = cm.GetType().GetMethod(nameof(cm.GetConverter));

                getConverterMethod = getConverterMethod.MakeGenericMethod(
                    typeof(DurableActivityContext),
                    this.parameterInfo.ParameterType,
                    typeof(ActivityTriggerAttribute));

                Delegate d = (Delegate)getConverterMethod.Invoke(cm, null);
                object   convertedValue = d.DynamicInvoke(value, this.attribute, context);

                var valueProvider = new ObjectValueProvider(
                    convertedValue,
                    this.parameterInfo.ParameterType);

                DurableActivityContext activityContext = (DurableActivityContext)value;
                var bindingData = new Dictionary <string, object>(StringComparer.OrdinalIgnoreCase)
                {
                    { nameof(DurableActivityContext.InstanceId), activityContext.InstanceId }
                };

                var triggerData = new TriggerData(valueProvider, bindingData);

                return(Task.FromResult <ITriggerData>(triggerData));
            }
        /// <inheritdoc />
        public void Initialize(ExtensionConfigContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

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

            // Use this if there is no other connection string set.
            _defaultConnectionString = nameResolver.Resolve(AzureWebJobsDocumentDBConnectionStringName);

            BindingFactory factory = new BindingFactory(nameResolver, converterManager);

            IBindingProvider outputProvider = factory.BindToGenericAsyncCollector <DocumentDBAttribute>((attr, t) => BindForOutput(attr, t, context.Trace));

            IBindingProvider clientProvider = factory.BindToExactType <DocumentDBAttribute, DocumentClient>(BindForClient);

            IBindingProvider itemProvider = factory.BindToGenericValueProvider <DocumentDBAttribute>((attr, t) => BindForItemAsync(attr, t, context.Trace));

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

            extensions.RegisterBindingRules <DocumentDBAttribute>(ValidateConnection, nameResolver, outputProvider, clientProvider, itemProvider);
        }
Пример #24
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);
        }
 public SimpleTriggerArgumentBinding(ITriggerBindingStrategy <TMessage, TTriggerValue> hooks, IConverterManager converterManager)
 {
     this._hooks       = hooks;
     this.Contract     = Hooks.GetStaticBindingContract();
     this.ElementType  = typeof(TMessage);
     _converterManager = converterManager;
 }
Пример #26
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);
        }
Пример #27
0
        void IExtensionConfigProvider.Initialize(ExtensionConfigContext context)
        {
            var rule = context.AddBindingRule <FakeQueueAttribute>();

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

            rule.AddOpenConverter <OpenType.Poco, FakeQueueData>(ConvertPocoToFakeQueueMessage);

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

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

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

            // Binds [FakeQueue] --> IAsyncCollector<FakeQueueData>
            rule.BindToCollector <FakeQueueData>(BuildFromAttr);

            // Binds [FakeQueue] --> FakeQueueClient
            rule.BindToInput <FakeQueueClient>(this);

            var triggerBindingProvider = new FakeQueueTriggerBindingProvider(this, cm);

            extensions.RegisterExtension <ITriggerBindingProvider>(triggerBindingProvider);
        }
Пример #28
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));
 }
 public ExtensionConfigContext(INameResolver nameResolver, IConverterManager converterManager, IWebHookProvider webHookProvider, IExtensionRegistry extensionRegistry)
 {
     _converterManager  = converterManager;
     _webHookProvider   = webHookProvider;
     _extensionRegistry = extensionRegistry;
     _nameResolver      = nameResolver;
 }
            public Task <ITriggerData> BindAsync(object value, ValueBindingContext context)
            {
                var  activityContext = (DurableActivityContext)value;
                Type destinationType = this.parameterInfo.ParameterType;

                object convertedValue;

                if (destinationType == typeof(object))
                {
                    // Straight assignment
                    convertedValue = value;
                }
                else
                {
                    // Try using the converter manager
                    IConverterManager cm = this.parent.extensionContext.Config.ConverterManager;
                    MethodInfo        getConverterMethod = cm.GetType().GetMethod(nameof(cm.GetConverter));
                    getConverterMethod = getConverterMethod.MakeGenericMethod(
                        typeof(DurableActivityContext),
                        destinationType,
                        typeof(ActivityTriggerAttribute));

                    Delegate d = (Delegate)getConverterMethod.Invoke(cm, null);
                    if (d != null)
                    {
                        convertedValue = d.DynamicInvoke(value, this.attribute, context);
                    }
                    else if (!destinationType.IsInterface)
                    {
                        MethodInfo getInputMethod = activityContext.GetType()
                                                    .GetMethod(nameof(activityContext.GetInput))
                                                    .MakeGenericMethod(destinationType);
                        convertedValue = getInputMethod.Invoke(activityContext, null);
                    }
                    else
                    {
                        throw new ArgumentException(
                                  $"Activity triggers cannot be bound to {destinationType}.",
                                  this.parameterInfo.Name);
                    }
                }

                var inputValueProvider = new ObjectValueProvider(
                    convertedValue,
                    this.parameterInfo.ParameterType);

                var bindingData = new Dictionary <string, object>(StringComparer.OrdinalIgnoreCase)
                {
                    { nameof(DurableActivityContext.InstanceId), activityContext.InstanceId },
                };

                var triggerData = new TriggerData(inputValueProvider, bindingData);

                triggerData.ReturnValueProvider = new ActivityTriggerReturnValueBinder(
                    activityContext,
                    this.parameterInfo.ParameterType);

                return(Task.FromResult <ITriggerData>(triggerData));
            }
 public EventHubTriggerAttributeBindingProvider(
     INameResolver nameResolver,
     IConverterManager converterManager,
     IEventHubProvider eventHubConfig)
 {
     this._nameResolver = nameResolver;
     this._converterManager = converterManager;
     this._eventHubConfig = eventHubConfig;
 }
 public FakeQueueBindingProvider(FakeQueueClient client, IConverterManager converterManager)
 {
     _client = client;
     _converterManager = converterManager;
 }