找出MediatR通知处理程序是否实现自定义接口

时间:2019-02-27 17:57:51

标签: c# asp.net-core cqrs mediatr

我正在使用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属性,但是我不知道如何使用它或检查它是否在实现我的界面。

enter image description here

任何提示都会很棒:)

1 个答案:

答案 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);                                
        }
    }