structuremap - 使用 StructureMap 配置的 MassTransit - ContainerScoped 不工作
问题描述
我在我的 StructureMap 配置中配置了一个带有 ContainerScope 的类 X,但是由于某种原因,当应用程序最初启动并且 MassTransit 消费者使用初始消息时,它会创建实例,但是在为该消费者接收到的后续消息中,消费者是重新创建,但不是对象 X(我希望每个收到的消息都会创建一个新实例)。我知道如果我用瞬态配置它会起作用,但我只想要为该消息的整个处理创建该类的单个实例。
对此的任何帮助将不胜感激。
解决方案
使用 MassTransit 时,创建新的消费者实例是每条消息的首选行为。建议使用该消费者的依赖项(可以由应用程序开发人员在容器中配置)来完成需要跨消息作为单个实例维护的任何状态或行为。
我意识到您在询问如何将您的使用者配置为单例,您可能会弄清楚,但如果您使用 AddMassTransit/AddConsumer,MassTransit 将重新配置容器以使其适用于每条消息。
更好的方法是配置您的状态:
public interface IConsumerState
{
}
public class ConsumerState :
IConsumerState
{
}
x.For<IConsumerState>().Use<ConsumerState>().Singleton();
然后,对于 MassTransit,在您的消费者依赖于该接口的位置配置您的消费者。
public class Consumer :
IConsume<Message>
{
public Consumer(IConsumerState state)
{
_state = state;
}
public async Consume(ConsumeContext<Message> context)
{
}
}
x.AddMassTransit(m =>
{
m.AddConsumer<Consumer>();
m.AddBus(provider => Bus.Factory.CreateUsingInMemory(cfg =>
{
cfg.ConfigureEndpoints();
}
});
使用这种方法,为每条消息创建一个新的消费者,并由所有消费者实例维护/共享状态。
推荐阅读
- c# - 将控制事件绑定到代码事件/命令/方法
- c# - 如何将基类对象的属性复制到子类对象
- java - 未应用从 svg 到 png 的渐变
- javascript - 将 JSF bean 值传递给 javascript 函数
- java - @PreDestroy 挂钩处的 Spring 计划任务状态
- ssas - 无法浏览多维数据集。验证多维数据集是否已部署和处理。(微软 SQL Server 管理工作室)
- matlab - Matlab图像图
- python - ValueError:最大值必须大于范围参数中的最小值
- node.js - Knex 正在返回检测到死锁
- json - 对 CSVW 元数据属性使用 JSON-LD 语言映射