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

时间:2020-10-28 22:32:23

标签: masstransit

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

我正在尝试为特定的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 >'

1 个答案:

答案 0 :(得分:1)

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

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()));
}