【发布时间】:2018-04-09 08:45:41
【问题描述】:
我有一个工作正常的 RabbitMQ 单例,但每当消息到达时都依赖于范围服务:
consumer.Received += _resourcesHandler.ProcessResourceObject; //Scoped Service
我的服务是这样注册的:
services.AddScoped<IHandler, Handler>();
services.AddSingleton<RabbitMqListener>();
作用域服务构造函数将 DI 用于 Db 上下文:
private readonly ApplicationDbContext _appDbContext;
public ResourcesHandler(ApplicationDbContext appDbContext)
{
_appDbContext = appDbContext;
}
此范围服务调用 Db 上下文,以便在收到消息时将属性插入数据库。
但是,由于作用域服务的生命周期不同,因此启动失败。
有没有更好的方法来做到这一点?我可以使作用域服务成为单例,但是我会遇到使用 DbContext 作为依赖项的问题。
DI 中用于在单例服务中调用 dbContext 的“协议”是什么?
我可以使用using 语句来确保它被释放,但是我必须使用 DI 来传递 DbContextOptions。这是实现这一目标的唯一方法吗?
【问题讨论】:
-
如果服务引用数据库上下文,则服务和数据库上下文必须具有相同的生命周期。
-
@StanleyOkpalaNwosa 是的。我明白这一点。我的问题是,在我的情况下,MQ 侦听器必须是单例服务才能收集消息。这是使用 ApplicationDbContext 的单例的依赖关系。有没有办法在单例中安全地调用 DbContext?
-
您是指作用域还是瞬态?我在您的代码中没有看到 AddScoped 方法。 Scoped 仅对通过 ASP.NET Core 管道传入的请求有意义。我不确定 RabbitMq 消息是否这样做。编辑:我看到您将 AddTransient 更改为 AddScoped...
-
@HansKilian 刷新!我正在使用 Transient 进行测试,但改回了作用域。道歉。扩展 - 我的 RabbitMQ 监听器在启动时获取注册的服务,因此它必须是单例的才能在启动时正确注册。
标签: c# .net asp.net-core rabbitmq