Masstransit InboundMessageInterceptor 与 Consumer 处于不同的 LifetimeScope 中

Masstransit InboundMessageInterceptor is in a different LifetimeScope to the Consumer

我已经将我自己的 headers 添加到我的消息中,我需要处理它们以在调用消费者之前为我的消费者设置数据库上下文(headers 允许我设置我的 NHibernate session 连接到正确的数据库,我不想在每个消费者中都处理它)。 我正在使用 Autofac,我已经创建了一个 IInboundMessageInterceptor 的实现来处理消息 headers。我用 Autofac 注册了拦截器,它可以很好地解析每条消息。 但是当我到达我的消费者时,每条被处理的消息的生命周期范围都是不同的,并且我在 MessageInterceptor 中配置的 session 不再在新的生命周期范围中配置。

a) 有没有办法在与消费者相同的生命周期范围内处理 MessageInterceptor? b) 是否有另一个地方,在与消费者相同的范围内,我可以拦截所有消息并处理 headers?我查看了 BeforeConsumingMessage,但它没有我可以看到的当前正在使用的消息的上下文。

谢谢

Autofac 并不真正了解 MassTransit。对象的解析被抽象为 Func<T>,因此它不依赖于任何容器。与这些选择相关,目前没有办法在解析消费者时说 "this is a session" 和范围。

我目前想不出一种方法可以在不拆开大量内部结构的情况下进行设置。我 post 向 https://github.com/masstransit/masstransit 提出了一个问题,也许我们可以想出一个合理的方法来共同解决这个问题。

如果您正在管理生命周期范围,您确实应该在 IConsumerFactory 级别进行拦截,而不是使用消息拦截器。

查看 AutofacConsumerFactory<T> 的源代码,您可以创建自己的实现来装饰它,或者您可以自定义并仅使用您自己的实现来管理您的事务范围,而不是嵌套它们从而在其中创建复杂性尊重。

这样,消费者收到的任何消息都使用适当的 ISession 设置进行包装。