为什么在构造函数中注入的MassTransit ConsumeContext不包含Message?

问题描述

我将ConsumeContext注入MyClass构造函数中。 MyClass被注册为Scoped,并注入到MyCommandConsumer构造函数中。消费者在Consume方法中收到消息时,ConsumeContext包含Message。但是没有将ConsumeContext注入MyClass构造函数(甚至MyCommandConsumer构造函数)中。所有非公共属性都返回ConsumeContext Not Available异常(或类似的东西)。

我在做什么错了?

解决方法

这是因为使用一条消息的上下文仅限于一条消息。即使使用者实现了IConsumer<T>时,每个消息都会实例化,但只有Consume消息会获取当前消息上下文。这就是Consume方法的目的。

ConsumeContext<T>不是 依赖项,而是上下文,因此 不应被注入,因为顾名思义,依赖项注入是,用于注入依赖关系,而不用于传递参数。 ConsumeContext<T>是一个参数,而不是依赖项。

,

如果消费者的依赖性需要发布消息,则应将IPublishEndpoint放在其构造函数上。

如果消费者的依赖项需要发送消息,则应在其构造函数上放置ISendEndpointProvider

如另一个答案所述,不建议依赖ConsumeContext