Exemple #1
0
        public AutoSubscriber(IZaabeeRabbitMqClient rabbitMqClient)
        {
            _rabbitMqClient = rabbitMqClient;
            var rabbitMqClientType = _rabbitMqClient.GetType();
            var methods            = rabbitMqClientType.GetMethods();

            _subscribeMethod = methods.First(m =>
                                             m.Name == "SubscribeEvent" &&
                                             m.GetParameters()[0].Name == "exchange" &&
                                             m.GetParameters()[1].Name == "queue" &&
                                             m.GetParameters()[2].ParameterType.ContainsGenericParameters &&
                                             m.GetParameters()[2].ParameterType.GetGenericTypeDefinition() == typeof(Action <>));
        }
Exemple #2
0
        public void RegisterMessageSubscriber(Type messageHandlerInterfaceType, Type messageInterfaceType,
                                              string handleName)
        {
            var messageHandlerTypes = _allTypes
                                      .Where(type => type.IsClass && messageHandlerInterfaceType.IsAssignableFrom(type)).ToList();

            var messageTypes = _allTypes
                               .Where(type => type.IsClass && messageInterfaceType.IsAssignableFrom(type)).ToList();

            var rabbitMqClientType = _rabbitMqClient.GetType();
            var subscribeMethod    = rabbitMqClientType.GetMethods().First(m =>
                                                                           m.Name == "SubscribeEvent" &&
                                                                           m.GetParameters()[0].Name == "exchange" &&
                                                                           m.GetParameters()[1].Name == "queue" &&
                                                                           m.GetParameters()[2].ParameterType.ContainsGenericParameters &&
                                                                           m.GetParameters()[2].ParameterType.GetGenericTypeDefinition() == typeof(Action <>));

            messageHandlerTypes.ForEach(messageHandlerType =>
            {
                var messageHandleMethods = messageHandlerType.GetMethods()
                                           .Where(m =>
                                                  m.Name == handleName &&
                                                  m.GetParameters().Count() == 1 &&
                                                  messageTypes.Contains(m.GetParameters()[0].ParameterType)
                                                  ).ToList();

                messageHandleMethods.ForEach(handleMethod =>
                {
                    var messageType = handleMethod.GetParameters()[0].ParameterType;

                    var paramTypeName = GetTypeName(messageType);
                    var exchangeName  = paramTypeName;
                    var queueName     = GetQueueName(handleMethod, paramTypeName);

                    void HandleAction(object message)
                    {
                        var actionT = typeof(Action <>).MakeGenericType(messageType);
                        using (var scope = _serviceScopeFactory.CreateScope())
                        {
                            var handler   = scope.ServiceProvider.GetService(messageHandlerType);
                            var @delegate = Delegate.CreateDelegate(actionT, handler, handleMethod);
                            @delegate.Method.Invoke(handler, new[] { message });
                        }
                    }

                    subscribeMethod.MakeGenericMethod(messageType)
                    .Invoke(_rabbitMqClient,
                            new object[] { exchangeName, queueName, (Action <object>)HandleAction, _prefetch });
                });
            });
        }
Exemple #3
0
        private void RegisterIntegrationEventSubscriber()
        {
            var integrationEventHandlerTypes = ZaabyServerExtension.AllTypes
                                               .Where(type => type.IsClass && typeof(IIntegrationEventHandler).IsAssignableFrom(type)).ToList();

            var integrationEventTypes = ZaabyServerExtension.AllTypes
                                        .Where(type => type.IsClass && typeof(IIntegrationEvent).IsAssignableFrom(type)).ToList();

            var rabbitMqClientType = _rabbitMqClient.GetType();
            var subscribeMethod    = rabbitMqClientType.GetMethods().First(m =>
                                                                           m.Name == "SubscribeEvent" &&
                                                                           m.GetParameters()[0].Name == "exchange" &&
                                                                           m.GetParameters()[1].Name == "queue" &&
                                                                           m.GetParameters()[2].ParameterType.ContainsGenericParameters &&
                                                                           m.GetParameters()[2].ParameterType.GetGenericTypeDefinition() == typeof(Action <>));

            integrationEventHandlerTypes.ForEach(integrationEventHandlerType =>
            {
                var handleMethods = integrationEventHandlerType.GetMethods()
                                    .Where(m =>
                                           m.Name == "Handle" &&
                                           m.GetParameters().Count() == 1 &&
                                           integrationEventTypes.Contains(m.GetParameters()[0].ParameterType)
                                           ).ToList();

                handleMethods.ForEach(handleMethod =>
                {
                    var integrationEventType = handleMethod.GetParameters()[0].ParameterType;

                    var paramTypeName = GetTypeName(integrationEventType);
                    var exchangeName  = paramTypeName;
                    var queueName     = GetQueueName(handleMethod, paramTypeName);

                    void HandleAction(object integrationEvent)
                    {
                        var actionT = typeof(Action <>).MakeGenericType(integrationEventType);
                        using (var scope = _serviceScopeFactory.CreateScope())
                        {
                            var handler = scope.ServiceProvider
                                          .GetService(integrationEventHandlerType);
                            var @delegate = Delegate.CreateDelegate(actionT, handler, handleMethod);
                            @delegate.Method.Invoke(handler, new[] { integrationEvent });
                        }
                    }

                    subscribeMethod.MakeGenericMethod(handleMethod.GetParameters()[0].ParameterType)
                    .Invoke(_rabbitMqClient,
                            new object[] { exchangeName, queueName, (Action <object>)HandleAction, (ushort)10 });
                });
            });
        }