MassTransit - non-scoped 发布过滤器

MassTransit - non-scoped publish fiters

我创建了一个 Masstransit 发布过滤器,它根据访问者提供的信息创建了一条消息 header。

我想在处理期间在访问器中设置一些值,这些值将由发布过滤器选取。

我对过滤器的理解是,它们是有范围的,因此,发布的任何消息都会创建一个新的 DI 范围。这意味着我在发布消息之前设置的值在过滤器中将不可用。

public interface IAccessor
{
   Guid Id {get;set;}
}

public class Accessor : IAccessor
{
   public Guid Id {get;set;}
}

public class MyPublishFilter<T> : IFilter<PublishContext<T>> where T : class 
{
    private readonly IAccessor accessor;
    public MyPublishFilter(IAccessor accessor) 
     => this.accessor = accessor; <-- this accessor is different to the one in MyProgram
    public async Task Send(PublishContext<T> context, IPipe<PublishContext<T>> next) 
    { 
        context.CorrelationId = accessor.Id; 
        await next.Send(context);
    }

public class MyProgram
{
    public MyProgram(IAccessor accessor) => this.accessor = accessor;
    public async Task DoThing()
    {
        accessor.Id = Guid.NewGuid();  <--- this value is not passed to the filter
        messageBus.Publish(new Message());
    }

}

有没有办法告诉 MassTransit 不要为消息过滤器创建新范围?

要使用现有范围,请使用 IPublishEndpoint 而不是 IBus 来发布消息。您应该从容器作用域服务提供者那里解析 IPublishEndpoint,作用域过滤器应该使用相同的作用域。

await using var scope = provider.CreateScope();

// use the scope to set your accessor Id

var publishEndpoint = scope.ServiceProvider.GetRequiredService<IPublishEndpoint>();

await publishEndpoint.Publish(...);