【问题标题】:MassTransit - non-scoped publish fitersMassTransit - 非范围发布过滤器
【发布时间】:2021-10-27 14:16:59
【问题描述】:

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

我想在处理过程中在访问器中设置一些值,这些值将被发布过滤器拾取。

我理解过滤器的方式是,它们是有范围的,因此,任何发布的消息都会创建一个新的 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 不要为消息过滤器创建新范围?

【问题讨论】:

    标签: c# .net-core masstransit


    【解决方案1】:

    要使用现有范围,请使用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(...);
    

    【讨论】:

      猜你喜欢
      • 2021-09-19
      • 1970-01-01
      • 2013-04-19
      • 1970-01-01
      • 2017-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多