Выясните, реализует ли обработчик уведомлений MediatR пользовательский интерфейс

Я использую 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 свойство, но я понятия не имею, как его использовать или проверить, реализует ли он мой интерфейс.

Любые намеки были бы отличными:)

1 ответ

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

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);                                
        }
    }
Другие вопросы по тегам