Masstransit InboundMessageInterceptor与Consumer的LifetimeScope不同

时间:2015-06-05 13:50:51

标签: c# autofac masstransit

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

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

由于

2 个答案:

答案 0 :(得分:2)

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

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

这样,消费者收到的任何消息都包含在正确的ISession设置中。

答案 1 :(得分:0)

Autofac并不真正了解MassTransit。对象的分辨率在Func<T>后面被抽象,因此它不与任何容器相关联。与这些选择相关,目前还没有一种方式可以说&#34;这是一个会话&#34;和解决消费者的范围。

我现在无法想到一种可以在没有大量撕裂内部设置的情况下进行设置的方法。我将问题发布到https://github.com/masstransit/masstransit,也许我们可以找到合理的方法来解决这个问题。