Я реализовал 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