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 <>)); }
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 }); }); }); }
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 }); }); }); }