如何配置具有特定消息类型的过滤器?

How to configure Filter with specific message type?

我只想使用特定类型和属性集的消息。创建任何消费者实例之前的一种消息内容过滤器。

我正在尝试为特定的 ConsumeContext 创建过滤器:

public class OrderFilter : IFilter<ConsumeContext<CreateOrderMessage>>
{
    public Task Send(ConsumeContext<CreateOrderMessage> context, IPipe<ConsumeContext<CreateOrderMessage>> next)
    {
        if (context.Message.IsTrustedUser)
        {
            return next.Send(context); // continue processing
        }
        return Task.CompletedTask; // stop message processing
    }

    public void Probe(ProbeContext context) { }
}

如何注册这样的过滤器?

我尝试在端点中注册它,但没有成功。我有

cfg.ReceiveEndpoint("OrderQueue", ep =>
{
    ep.UseFilter(new OrderFilter());
    ep.Consumer<CreateOrderConsumer>();
});

我遇到以下错误:无法将实例参数类型“{MassTransit.IReceiveEndpointConfigurator,MassTransit.RabbitMqTransport.IRabbitMqReceiveEndpointConfigurator}”转换为 'GreenPipes.IPipeConfigurator<MassTransit.ConsumeContext<Core.CreateOrderMessage>>'

所以,曾经有一个用于此目的的扩展方法,但我找不到了。您可以在创建使用者之前添加过滤器,方法是创建过滤器规范并添加它,如下所示。

var filter = new OrderFilter();
var specification = new FilterPipeSpecification<ConsumeContext< CreateOrderMessage >>(filter);
ep.AddPipeSpecification(specification);

如果您想在消费者创建后执行过滤器(例如,如果您使用容器作用域来共享信息),您可以使用作用域消耗过滤器(在几个答案和文档中都有描述)或者您可以在消费者配置期间添加您的过滤器。

ep.Consumer<CreateOrderConsumer>(cc =>
{
    cc.Message<CreateOrderMessage>(mc => mc.UseFilter(new OrderFilter()));
}