Выясните, реализует ли обработчик уведомлений 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);
}
}