首页 > 解决方案 > 所有消费者/所有消息类型的公共交通过滤器

问题描述

我正在尝试创建一个将对所有消息类型执行的过滤器。理想情况下,您只需注册一次过滤器,而不是为每个消费者注册一次。(我也想在发布方面做同样的事情)。我需要它在生命周期内。它只是要从标头中弹出一个值,并将其分配给我的 DI 容器将提供的生命周期范围的对象(发布方则相反)

我在中间件上观看了 Chris Patterson 的 twitch 视频,我认为它接近我想要的 38 分钟左右,但他为特定消费者注册了过滤器。在消费者方面,我认为我需要一个来自 ConsumeContext 的过滤器,但我只是不知道如何以一种可用于所有消费者的方式注册过滤器。我正在使用 MT 7 和 Autofac。谁能告诉我一些关于如何注册适用于所有消费者的范围过滤器的示例代码?(如果它非常不同,那么它适用于所有出版商)?

标签: c#rabbitmqmasstransit

解决方案


如果您需要在生命周期范围内的过滤器,则需要使用范围过滤器(需要 MassTransit v7)。这将为任何消费者注册过滤器,以便执行它。您确实需要使您的过滤器通用,T作为一种消息类型,您可以选择使用或忽略它。

public class MyFilter<T> :
    IFilter<ConsumeContext<T>>
    where T : class
{
    SomeScopedObject _obj;

    public MyFilter(SomeScopedObject obj) 
    {
        _obj = obj;
    }
  
    public async Task Send(ConsumeContext<T> context, IPipe<ConsumeContext<T>> next)
    {
        // do your thing with _obj

        await next.Send(context);
    }

    public void Probe(ProbeContext context)
    {
    }
}

然后,在您的接收端点上,在消费者之前配置过滤器。

e.UseConsumeFilter(typeof(MyFilter<>));

这将为每个消费者/消息配置一个在消费者的容器范围内执行的过滤器版本。

您可以对发布/发送执行相同的操作。

文档在网站上。


推荐阅读