用于在收到的每条消息上设置多租户范围值的预期 MassTransit 中间件构造是什么?

What is the intended MassTransit middleware construct for setting mult-tenant scope values upon each message received?

我将 MassTransit 与 Autofac 结合使用,需要一种方法来查询入站消息以获得租户 ID,该 ID 将用于动态构建连接字符串。所以逻辑步骤如下:

  1. 收到一条消息

  2. 从消息中检索租户 ID,并使用每个消息范围的组件来设置租户 ID

  3. 消息消费者由容器解析,容器使用每个消息范围的组件相应地构建依赖关系。

    MassTransit 有一个如何创建消息过滤器的示例 here。乍一看,这似乎是一个潜在的解决方案,但似乎并没有使用与解析每条消息的消费者相同的生命周期范围来解析消息过滤器的新实例。

所以我的问题是:邮件过滤器可以用于此目的吗?如果是这样,请提供一个示例或指向一个显示类似内容的示例(例如,任何使用 DI 容器的地方都支持访问每条消息生命周期资源的范围)。如果没有,那么通过 MassTransit 满足这一需求的预期方式是什么?

根据查看代码,您应该能够在 ConsumeContext 级别创建一个新的 ILifetimeScope,并将由消费者使用。下面包含一个过滤器逻辑示例。

public class LifetimeScopeFilter :
    IFilter<ConsumeContext>
{
    LifetimeScopeFilter(ILifetimeScope mainScope)
    {
        _mainScope = mainScope;
    }

    public void Probe(ProbeContext context)
    {
        var scope = context.CreateFilterScope("lifetimeScope");
    }

    public async Task Send(ConsumeContext context, IPipe<ConsumeContext> next)
    {
        ILifetimeScope scope = null;

        try
        {
            context.GetOrAddPayload<ILifetimeScope>(() => scope = _mainScope.BeginLifetimeScope())

            await next.Send(context).ConfigureAwait(false);
        }
        finally
        {
            scope?.Dispose();
        }
    }
}