public async Task <TResult> DispatchAsync <TResult>(IQuery <TResult> query, CancellationToken cancellationToken = default)
        {
            try
            {
                // Pre

                foreach (var preHandler in _scope.Resolve <IEnumerable <IPreHandleQuery> >())
                {
                    await preHandler.PreHandleAsync(query, cancellationToken);
                }

                foreach (dynamic preHandler in (IEnumerable <dynamic>)_scope.Resolve(typeof(IEnumerable <>).MakeGenericType(typeof(IPreHandleQuery <,>).MakeGenericType(query.GetType(), typeof(TResult)))))
                {
                    await preHandler.PreHandleAsync((dynamic)query, cancellationToken);
                }

                // Inner

                var result = await _next.DispatchAsync(query, cancellationToken);

                // Post

                foreach (var postHandler in _scope.Resolve <IEnumerable <IPostHandleQuery> >())
                {
                    await postHandler.PostHandleAsync(query, result, cancellationToken);
                }

                foreach (dynamic postHandler in (IEnumerable <dynamic>)_scope.Resolve(typeof(IEnumerable <>).MakeGenericType(typeof(IPostHandleQuery <,>).MakeGenericType(query.GetType(), typeof(TResult)))))
                {
                    await postHandler.PostHandleAsync((dynamic)query, result, cancellationToken);
                }

                return(result);
            }
            catch (Exception exception)
            {
                // Error

                foreach (var errorHandler in _scope.Resolve <IEnumerable <IHandleQueryFailure> >())
                {
                    await errorHandler.HandleFailureAsync(query, exception, cancellationToken);
                }

                foreach (dynamic errorHandler in (IEnumerable <dynamic>)_scope.Resolve(typeof(IEnumerable <>).MakeGenericType(typeof(IHandleQueryFailure <,>).MakeGenericType(query.GetType(), typeof(TResult)))))
                {
                    await errorHandler.HandleFailureAsync((dynamic)query, exception, cancellationToken);
                }

                throw;
            }
        }
Ejemplo n.º 2
0
        public async Task <TResult> DispatchAsync <TResult>(IQuery <TResult> query, CancellationToken cancellationToken = default)
        {
            var stopWatch = new System.Diagnostics.Stopwatch();

            stopWatch.Start();

            try
            {
                var result = await _next.DispatchAsync(query, cancellationToken);

                stopWatch.Stop();
                _log.Verbose("{query} processed in {duration} ms", query.GetType().Name, stopWatch.ElapsedMilliseconds);
                return(result);
            }
            catch
            {
                stopWatch.Stop();
                _log.Verbose("{query} failed in {duration} ms", query.GetType().Name, stopWatch.ElapsedMilliseconds);
                throw;
            }
        }
 public async Task <TResult> ReceiveAsync <TResult>(IQuery <TResult> query, CancellationToken cancellationToken = default)
 {
     return(await _queryDispatcher.DispatchAsync(query, cancellationToken));
 }