Mediatr范围问题
Mediatr Scope problems
我正在使用 Mediatr 处理来自队列的消息。我可以得到一个简单的例子来工作。但是,当我尝试将对象注入我的处理程序时,我遇到了 运行 问题
public class MessageCommandHandler : IRequestHandler<MessageCommand, bool>
{
private IMyDependency myDependency;
public MessageCommandHandler(IMyDependency myDependency)
{
this.myDependency = myDependency;
}
public Task<bool> Handle(MessageCommand request, CancellationToken cancellationToken)
{
return Task.FromResult(true);
}
}
这仅在我将 IMyDependency
注册为瞬态作用域时有效,但是当我将其注册为作用域生命周期时,它会失败并显示错误
Cannot resolve 'MediatR.IRequestHandler`2[MyNamespace.MessageCommand,System.Boolean]' from root provider because it requires scoped service 'MyNamespace.IMyDependency'
我需要能够注入具有作用域生命周期的依赖项。有没有人对此有解决方案。
我正在使用 .NET Core 依赖注入框架。设置如下
services.AddHostedService<QueueConsumer>();
services.AddScoped<IMyDependency, MyDependency>();
services.AddMediatR(new Assembly[] { Assembly.GetExecutingAssembly() });
有什么想法吗?
任何时候你使用具有 Scoped 生命周期的依赖项,你都需要在 pre-created 范围内使用它。在 MVC 的情况下,这会在幕后自动发生,但如果您直接从自己的代码中使用,比如通过控制台应用程序或其他东西,您将需要自己创建范围。
这可以通过注入 IServiceScopeFactory
的实例,然后使用该工厂创建范围,然后从该范围检索依赖项来完成,例如
public class MessageCommandHandler : IRequestHandler<MessageCommand, bool>
{
private IServiceScopeFactory _serviceScopeFactory;
public MessageCommandHandler(IServiceScopeFactory serviceScopeFactory)
{
_serviceScopeFactory = serviceScopeFactory;
}
public Task<bool> Handle(MessageCommand request, CancellationToken cancellationToken)
{
using (var scope = _serviceScopeFactory.CreateScope())
{
var scopedServices = scope.ServiceProvider;
var myDependency = scopedServices.GetRequiredService<IMyDependency>();
return Task.FromResult(true);
}
}
}
但是(请注意上面的代码未经测试),在我自己的系统中,我几乎总是围绕发送中介请求的任何内容创建范围,在这种情况下,任何 Scoped 依赖项仍将在此范围内自动注入,例如
... // some other calling class / Main method etc..
using (var scope = _serviceScopeFactory.CreateScope())
var mediator = scope.ServiceProvider.GetRequiredService<IMediator>();
mediator.Send(new MessageCommand());
}
我正在使用 Mediatr 处理来自队列的消息。我可以得到一个简单的例子来工作。但是,当我尝试将对象注入我的处理程序时,我遇到了 运行 问题
public class MessageCommandHandler : IRequestHandler<MessageCommand, bool>
{
private IMyDependency myDependency;
public MessageCommandHandler(IMyDependency myDependency)
{
this.myDependency = myDependency;
}
public Task<bool> Handle(MessageCommand request, CancellationToken cancellationToken)
{
return Task.FromResult(true);
}
}
这仅在我将 IMyDependency
注册为瞬态作用域时有效,但是当我将其注册为作用域生命周期时,它会失败并显示错误
Cannot resolve 'MediatR.IRequestHandler`2[MyNamespace.MessageCommand,System.Boolean]' from root provider because it requires scoped service 'MyNamespace.IMyDependency'
我需要能够注入具有作用域生命周期的依赖项。有没有人对此有解决方案。
我正在使用 .NET Core 依赖注入框架。设置如下
services.AddHostedService<QueueConsumer>();
services.AddScoped<IMyDependency, MyDependency>();
services.AddMediatR(new Assembly[] { Assembly.GetExecutingAssembly() });
有什么想法吗?
任何时候你使用具有 Scoped 生命周期的依赖项,你都需要在 pre-created 范围内使用它。在 MVC 的情况下,这会在幕后自动发生,但如果您直接从自己的代码中使用,比如通过控制台应用程序或其他东西,您将需要自己创建范围。
这可以通过注入 IServiceScopeFactory
的实例,然后使用该工厂创建范围,然后从该范围检索依赖项来完成,例如
public class MessageCommandHandler : IRequestHandler<MessageCommand, bool>
{
private IServiceScopeFactory _serviceScopeFactory;
public MessageCommandHandler(IServiceScopeFactory serviceScopeFactory)
{
_serviceScopeFactory = serviceScopeFactory;
}
public Task<bool> Handle(MessageCommand request, CancellationToken cancellationToken)
{
using (var scope = _serviceScopeFactory.CreateScope())
{
var scopedServices = scope.ServiceProvider;
var myDependency = scopedServices.GetRequiredService<IMyDependency>();
return Task.FromResult(true);
}
}
}
但是(请注意上面的代码未经测试),在我自己的系统中,我几乎总是围绕发送中介请求的任何内容创建范围,在这种情况下,任何 Scoped 依赖项仍将在此范围内自动注入,例如
... // some other calling class / Main method etc..
using (var scope = _serviceScopeFactory.CreateScope())
var mediator = scope.ServiceProvider.GetRequiredService<IMediator>();
mediator.Send(new MessageCommand());
}