示例#1
0
        public async Task <TQueryResult> DispatchAsync <TQueryResult>(IQuery <TQueryResult> query, CancellationToken cancellationToken = default)
        {
            if (query == null)
            {
                throw new ArgumentNullException(nameof(query));
            }

            cancellationToken.ThrowIfCancellationRequested();

            var type = query.GetType();

            _logger.LogInformation($"Dispatching query '{type.FriendlyName()}' returning '{typeof(TQueryResult).FriendlyName()}'.");

            var handler = _serviceProvider.GetService(typeof(IQueryHandler <,>).MakeGenericType(type, typeof(TQueryResult)));

            if (handler == null)
            {
                throw new InvalidOperationException($"No query handler for type '{type.FriendlyName()}' has been registered.");
            }

            var result = await(Task <TQueryResult>) handler.GetType().GetMethod("RetrieveAsync").Invoke(handler, new object[] { query, cancellationToken });

            await _queryStore.SaveAsync <TQueryResult>(query, cancellationToken);

            return(result);
        }