示例#1
0
        /// <summary>
        /// Registers all IQueueConsumers in assemblies
        /// </summary>
        public IEnumerable <Type> RegisterAssemblyConsumers(Func <IConsumerFactory> consumerFactoryBuilder, params Type[] assemblyTypes)
        {
            List <Type> list = new List <Type>();

            foreach (Type assemblyType in assemblyTypes)
            {
                foreach (Type type in assemblyType.Assembly.GetTypes())
                {
                    List <ModelTypeInfo> types = FindModelTypes(type);
                    foreach (ModelTypeInfo typeInfo in types)
                    {
                        ReadSubscription subscription = CreateConsumerSubscription(typeInfo, consumerFactoryBuilder);
                        if (subscription == null)
                        {
                            continue;
                        }

                        lock (_subscriptions)
                            _subscriptions.Add(subscription);
                    }

                    if (types.Count > 0)
                    {
                        list.Add(type);
                    }
                }
            }

            return(list);
        }
示例#2
0
        /// <summary>
        /// Subscribe to direct messages with a content type
        /// </summary>
        public void OnDirect <T>(ushort contentType, Action <T> action)
        {
            ReadSubscription subscription = new ReadSubscription
            {
                Source      = ReadSource.Direct,
                ContentType = contentType,
                MessageType = typeof(T),
                Action      = action
            };

            lock (_subscriptions)
                _subscriptions.Add(subscription);
        }
示例#3
0
        /// <summary>
        /// Subscribe to messages from a queue
        /// </summary>
        public void On <T>(string queueName, Action <T> action)
        {
            ReadSubscription subscription = new ReadSubscription
            {
                Source      = ReadSource.Queue,
                Queue       = queueName,
                MessageType = typeof(T),
                Action      = action
            };

            lock (_subscriptions)
                _subscriptions.Add(subscription);
        }
示例#4
0
        /// <summary>
        /// Subscribe to direct messages with a content type
        /// </summary>
        public void OnDirect <T>(ushort contentType, Action <T, HorseMessage> action)
        {
            ReadSubscription subscription = new ReadSubscription
            {
                Source              = ReadSource.Direct,
                ContentType         = contentType,
                MessageType         = typeof(T),
                Action              = action,
                HmqMessageParameter = true
            };

            lock (_subscriptions)
                _subscriptions.Add(subscription);
        }
示例#5
0
        /// <summary>
        /// Subscribe to messages of a queue
        /// </summary>
        public void On <T>(string queueName, Action <T, HorseMessage> action)
        {
            ReadSubscription subscription = new ReadSubscription
            {
                Source              = ReadSource.Queue,
                Queue               = queueName,
                MessageType         = typeof(T),
                Action              = action,
                HmqMessageParameter = true
            };

            lock (_subscriptions)
                _subscriptions.Add(subscription);
        }
示例#6
0
        /// <summary>
        /// Registers a single consumer
        /// </summary>
        public void RegisterConsumer(Type consumerType, Func <IConsumerFactory> consumerFactoryBuilder = null)
        {
            List <ModelTypeInfo> types = FindModelTypes(consumerType);

            foreach (ModelTypeInfo typeInfo in types)
            {
                ReadSubscription subscription = CreateConsumerSubscription(typeInfo, consumerFactoryBuilder);
                if (subscription == null)
                {
                    throw new TypeLoadException("Cant resolve consumer type");
                }

                lock (_subscriptions)
                    _subscriptions.Add(subscription);
            }
        }
示例#7
0
        /// <summary>
        /// Subscribes to handle requests
        /// </summary>
        public void OnRequest <TRequest, TResponse>(ushort contentType, IHorseRequestHandler <TRequest, TResponse> handler)
        {
            ReadSubscription subscription = new ReadSubscription
            {
                Source              = ReadSource.Request,
                Queue               = null,
                ContentType         = contentType,
                MessageType         = typeof(TRequest),
                Action              = null,
                HmqMessageParameter = true,
                ConsumerExecuter    = new RequestHandlerExecuter <TRequest, TResponse>(handler.GetType(), handler, null)
            };

            lock (_subscriptions)
                _subscriptions.Add(subscription);
        }
示例#8
0
        private ReadSubscription CreateConsumerSubscription(ModelTypeInfo typeInfo, Func <IConsumerFactory> consumerFactoryBuilder)
        {
            bool useConsumerFactory = consumerFactoryBuilder != null;

            TypeDeliveryResolver   resolver           = new TypeDeliveryResolver();
            TypeDeliveryDescriptor consumerDescriptor = resolver.Resolve(typeInfo.ConsumerType, null);
            TypeDeliveryDescriptor modelDescriptor    = resolver.Resolve(typeInfo.ModelType, Configurator);
            var target = GetTarget(typeInfo.Source, consumerDescriptor, modelDescriptor);

            object consumerInstance = useConsumerFactory ? null : Activator.CreateInstance(typeInfo.ConsumerType);

            ConsumerExecuter executer = null;

            switch (typeInfo.Source)
            {
            case ReadSource.Queue:
            {
                Type executerType        = typeof(QueueConsumerExecuter <>);
                Type executerGenericType = executerType.MakeGenericType(typeInfo.ModelType);
                executer = (ConsumerExecuter)Activator.CreateInstance(executerGenericType,
                                                                      typeInfo.ConsumerType,
                                                                      consumerInstance,
                                                                      consumerFactoryBuilder);
                break;
            }

            case ReadSource.Direct:
            {
                Type executerType        = typeof(DirectConsumerExecuter <>);
                Type executerGenericType = executerType.MakeGenericType(typeInfo.ModelType);
                executer = (ConsumerExecuter)Activator.CreateInstance(executerGenericType,
                                                                      typeInfo.ConsumerType,
                                                                      consumerInstance,
                                                                      consumerFactoryBuilder);
                break;
            }

            case ReadSource.Request:
            {
                Type executerType        = typeof(RequestHandlerExecuter <,>);
                Type executerGenericType = executerType.MakeGenericType(typeInfo.ModelType, typeInfo.ResponseType);
                executer = (ConsumerExecuter)Activator.CreateInstance(executerGenericType,
                                                                      typeInfo.ConsumerType,
                                                                      consumerInstance,
                                                                      consumerFactoryBuilder);
                break;
            }
            }

            if (executer != null)
            {
                executer.Resolve(Configurator);
            }

            ReadSubscription subscription = new ReadSubscription
            {
                Source           = typeInfo.Source,
                Queue            = target.Item1,
                ContentType      = target.Item2,
                MessageType      = typeInfo.ModelType,
                ResponseType     = typeInfo.ResponseType,
                Action           = null,
                ConsumerExecuter = executer
            };

            return(subscription);
        }