private void OnMessageReceived(object sender, DLB.EventBus.Transport.Messages.TransportMessage e)
        {
            var    handler = _subscribers.FirstOrDefault(p => p.Topic == e.Topic);
            string jsonStr = Encoding.UTF8.GetString(e.Body);

            if (!string.IsNullOrEmpty(jsonStr))
            {
                // Message received context
                var context = new HandleContext(_consumerClient, e.Headers);
                var method  = handler.GetType().GetMethod(HandleAsyncMethod);

                // Get only dynamic parameter, type of IntegrationEventData
                var type = method.GetParameters().FirstOrDefault().ParameterType;
                var data = JsonConvert.DeserializeObject(jsonStr, type);

                object[] parametersArray = new object[] { data, context, this };

                method.Invoke(handler, parametersArray);
            }
        }
        private async Task OnMessageReceivedAsync(object sender, DLB.EventBus.Transport.Messages.TransportMessage e)
        {
            using (var scope = _serviceScopeFactory.CreateScope())
            {
                var    subscribers = scope.ServiceProvider.GetService <IEnumerable <ISubscriber> >();
                string jsonStr     = Encoding.UTF8.GetString(e.Body);
                var    handlerList = subscribers.Where(p => p.Topic == e.Topic);

                if (!string.IsNullOrEmpty(jsonStr) && handlerList != null && handlerList.Any())
                {
                    // Message received context
                    var context = new HandleContext(_consumerClient, e);

                    foreach (var handler in handlerList)
                    {
                        // Get only dynamic parameter, type of IntegrationEventData
                        var method     = handler.GetType().GetMethod(HandleAsyncMethod);
                        var type       = method.GetParameters().FirstOrDefault().ParameterType;
                        var headerType = e.Headers[Messages.Headers.Type];


                        if (headerType == type.Name)
                        {
                            // If no throw exception we found a valid handler
                            var data = JsonConvert.DeserializeObject(jsonStr, type, this._options.JsonSerializerSettings);

                            object[] parametersArray = new object[] { data, context, this };

                            var task = (Task)method.Invoke(handler, parametersArray);

                            await task.ConfigureAwait(false);

                            break;
                        }
                    }
                }
            }
        }