问题描述
我只想使用设置了特定类型和属性的消息。在创建任何使用者实例之前,一种消息内容过滤器。
我正在尝试为特定的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
解决方法
因此,曾经有一个扩展方法用于此目的,但我找不到它。您可以通过创建过滤器规范并按如下所示添加它,在创建使用者之前添加过滤器。
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()));
}