Mediatr IPipelineBehavior не срабатывает - PullRequest
0 голосов
/ 10 марта 2020

Я реализовал Mediatr в своем проекте .NET framework и хотел бы использовать IPipelineBehavior.

Я реализовал и зарегистрировал контейнер, используя пример из проекта: https://github.com/jbogard/MediatR/blob/master/samples/MediatR.Examples.Unity/Program.cs

Это мое поведение

public class AuditPipelineBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
    {
        private readonly ILeaveAuditTrail _auditor;

        public AuditPipelineBehavior(ILeaveAuditTrail auditor)
        {
            _auditor = auditor;
        }
        public async Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate<TResponse> next)
        {
            if (AuditPrevented(request))
                return await next();

            var response = await next();
            var auditLog = _auditor.CreateAuditLog(request, response);
            //Dispatch audit

            return response;
        }

        private static bool AuditPrevented<TInput>(TInput query)
        {
            return query.GetType().GetCustomAttributes(typeof(PreventAuditAttribute), true).Any();
        }
    }

И я регистрируюсь так же, как и мой Mediatr

container.RegisterMediator(new HierarchicalLifetimeManager());
            container.RegisterMediatorHandlers(applicationAssembly);
            container.RegisterType(typeof(IPipelineBehavior<,>), typeof(AuditPipelineBehavior<,>));
            container.RegisterType<ILeaveAuditTrail, DefaultAuditor>();

Когда я отправляю IRequest с Mediatr это обрабатывается нормально, и я получаю результаты, но AuditPipeline не вызывается.

Если я удаляю ключевое слово async и просто возвращаю next(); Это работает. Но таким образом я не могу правильно перехватить мой ответ.

Также на примере Github дескриптор реализован asyn c: https://github.com/jbogard/MediatR/wiki/Behaviors

1 Ответ

0 голосов
/ 12 марта 2020

Проблема не связана с регистрацией Mediatr или PipelineBehavior.

При вызове метода mediator.Send() он не был в асинхронном методе c. .Result был использован вместо await. Из-за этого обработка конвейера работала только при отсутствии ключевого слова async.

Никогда не используйте .Result для объединения этих асинхронных вызовов c. Отметьте метод контроллера async и дождитесь mediator.Send()

...