我正在使用MediatR发布通知。
我已经定义了一个通知处理程序,如下所示:
public class TestNotificationHandler : INotificationHandler<TestNotification>, IWithinTransaction
{
public Task Handle(TestNotification notification, CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
}
然后,我创建了一个自定义的Mediatr发布者,如here所示。发生的是,在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
属性,但是我不知道如何使用它或检查它是否在实现我的界面。
任何提示都会很棒:)
答案 0 :(得分:0)
我刚找到它。
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);
}
}