Выясните, реализует ли обработчик уведомлений MediatR пользовательский интерфейс - PullRequest
0 голосов
/ 27 февраля 2019

Я использую MediatR для публикации уведомлений.

Я определил обработчик уведомлений следующим образом:

public class TestNotificationHandler : INotificationHandler<TestNotification>, IWithinTransaction
{
    public Task Handle(TestNotification notification, CancellationToken cancellationToken)
    {
        return Task.CompletedTask;
    }
}

Затем я создал собственного издателя Mediatr, как показано здесь .Происходит следующее: в классе Publisher, в зависимости от выбранной стратегии, вызывается конкретная реализация, которая вызывает зарегистрированные обработчики событий, например, для стратегии SyncStopOnException:

private async Task SyncStopOnException(IEnumerable<Func<Task>> handlers)
{
    foreach (var handler in handlers)
    {                                
        await handler().ConfigureAwait(false);                                
     }
 }

Действительно, в foreach я получаюверните обработчик TestNotificationHandler правильно, и он будет выполнен.Так что это работает нормально.

Но теперь я хочу отфильтровать эти обработчики, чтобы выполнялись только те, которые реализуют мой пользовательский интерфейс IWithinTransaction .

И вот тут у меня проблемы.Поскольку обработчик имеет тип System.Func.

Итак, вопрос: как я могу узнать, реализует ли этот интерфейс обработчик уведомлений, которому принадлежит обработчик?Единственное, что близко, это свойство handler.Target, но я не знаю, как его использовать или проверить, реализует ли он мой интерфейс.

enter image description here

Любые намеки были бы великолепны :) 1027 *

1 Ответ

0 голосов
/ 27 февраля 2019

Я только что нашел это.

private async Task SyncStopOnException(IEnumerable<Func<Task>> handlers)
    {
        foreach (var handler in handlers)
        {
            object target = handler.Target;
            if (target != null)
            {
                var xField = target.GetType().GetFields().Single(f => f.Name == "x");
                var xFieldValue = xField.GetValue(target);
                if (xFieldValue as IWithinTransaction != null)
                {

                }
            }

            await handler().ConfigureAwait(false);                                
        }
    }
...