我知道建议将实现IConsumer<T>
的实例注册为作用域实例。
public class OrderCompleteEventHandler : IConsumer<IOrderCompleteEvent>
{
private readonly IOrderService _orderService;
public OrderCompleteEventHandler(IOrderService orderService)
{
_orderService = orderService;
}
public Task Consume(ConsumeContext<IOrderCompleteEvent> context) => _orderService.DoSomething();
}
在上面的示例中,这是否意味着OrderCompleteEventHandler
会在它消耗的每条消息之后被处置,从而将captive dependency引入所有注入的服务中?
注册消费者及其注入的服务的生命周期时,我们还有哪些其他选择?
答案 0 :(得分:1)
消费被封装在每个消息的生命周期范围内。这样做是为了确保可以高度并行地使用消息。如果负载足够大。 MassTransit将使用多个使用者实例,因此整体吞吐量会增加。
我不确定这与俘虏依赖性有什么关系。马克的文章清楚地描述了具有在临时范围内注册的依赖项的单例将有效地成为单例。由于从定义上讲,消费者不是单例,因此他们实际上无法创建圈养依赖性。
消费者可能还具有其他依赖关系,这些依赖关系可能都是瞬时的,因此将根据消息,作用域或单例实例化。