首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mediatr范围问题

Mediatr范围问题
EN

Stack Overflow用户
提问于 2019-07-12 14:08:09
回答 1查看 8.5K关注 0票数 15

我使用Mediatr处理来自队列的消息。我可以得到一个简单的例子来工作。然而,当我试图将一个对象注入我的处理程序时,我遇到了一些问题。

代码语言:javascript
复制
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注册为瞬态作用域时才有效,但是当我将其注册为作用域生存期时,它会因错误而失败。

代码语言:javascript
复制
Cannot resolve 'MediatR.IRequestHandler`2[MyNamespace.MessageCommand,System.Boolean]' from root provider because it requires scoped service 'MyNamespace.IMyDependency'

我需要能够注入具有作用域生存期的依赖项。有人有办法解决这个问题吗。

我使用的是.NET核心依赖注入框架。它的设置如下

代码语言:javascript
复制
services.AddHostedService<QueueConsumer>();
services.AddScoped<IMyDependency, MyDependency>();
services.AddMediatR(new Assembly[] { Assembly.GetExecutingAssembly() });

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-20 09:21:02

当您使用具有作用域生存期的依赖项时,您将需要在预先创建的范围内使用它。在MVC的情况下,这将自动发生在幕后,但是如果您直接使用自己的代码,比如通过控制台应用程序或其他什么的话,您将需要自己创建作用域。

这可以通过注入一个IServiceScopeFactory实例来实现,然后使用这个工厂创建一个作用域,然后从该作用域检索依赖项。

代码语言:javascript
复制
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);
            }
        }
    }

但是(请注意,上面的代码是未经测试的),在我自己的系统中,我几乎总是围绕发送中介请求的内容创建作用域,在这种情况下,任何作用域依赖项仍然会在这个范围内自动注入。

代码语言:javascript
复制
... // some other calling class / Main method etc..

using (var scope = _serviceScopeFactory.CreateScope())
    var mediator = scope.ServiceProvider.GetRequiredService<IMediator>();
    mediator.Send(new MessageCommand());
}
票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57008673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档