/// <summary>
        /// Register query async handler.
        /// </summary>
        /// <typeparam name="TQuery">Type of query to be handled.</typeparam>
        /// <typeparam name="TResult">Type of query's result.</typeparam>
        /// <param name="queryAsyncHandlerFactory">Factory which will provide an instance of a query handler that handles the specified <typeparamref name="TQuery"/> query.</param>
        public void Register <TQuery, TResult>(Func <IQueryAsyncHandler <TQuery, TResult> > queryAsyncHandlerFactory) where TQuery : class, IQuery <TResult>
        {
            if (queryAsyncHandlerFactory == null)
            {
                throw new ArgumentNullException(nameof(queryAsyncHandlerFactory));
            }

            Type queryType = typeof(TQuery);

            QueryHandlerDelegate <TResult> handleQueryDelegate;

            if (_queryHandlerDelegatesByQueryType.TryGetValue(queryType, out handleQueryDelegate))
            {
                throw new InvalidOperationException($"Duplicate query handler registered for {queryType.Name}.");
            }

            QueryHandlerDelegate <TResult> newHandleQueryDelegate = QueryHandlerDelegateBuilder.FromFactory(queryAsyncHandlerFactory);

            _queryHandlerDelegatesByQueryType.Add(queryType, newHandleQueryDelegate);
        }