public TResult Request <TMsg, TResult>(TMsg args) where TMsg : IRequest
        {
            var handlers = GetHandlers <TMsg>();

            MessageBusCheck.Require(handlers != null && handlers.Any(), "No handlers found for message type " + args.GetType().Name);
            MessageBusCheck.Require(handlers.Count() == 1, "Expected exactly one handler for request " + args.GetType().Name + ". Found " + handlers.Count() + " handlers.");
            return((TResult)Invoke("Get", handlers.First(), args));
        }
        public void Send <TMsg>(TMsg args) where TMsg : ICommand
        {
            var handlers = GetHandlers <TMsg>();

            MessageBusCheck.Require(handlers != null && handlers.Any(), "No handlers found for message type " + args.GetType().Name);
            foreach (var handler in handlers)
            {
                Invoke("Handle", handler, args);
            }
        }
        public TResult Create <TMsg, TResult>(TMsg args) where TMsg : ICommand
        {
            var handlers = GetHandlers <TMsg>();

            MessageBusCheck.Require(handlers != null && handlers.Any(), "No handlers found for message type " + typeof(TMsg).Name);
            object result = null;

            foreach (var handler in handlers)
            {
                object newResult = Invoke("Handle", handler, args);
                MessageBusCheck.Require(newResult == null || result == null, "Only one handler for a Create message can return a value, found multiple return objects for message {0}.", args.GetType().Name);
                if (newResult != null)
                {
                    result = newResult;
                }
            }
            return((TResult)result);
        }