首页 > 解决方案 > 如何在不使用 ScopeFactory 的情况下将服务注入 HostedService?

问题描述

我为这个问题找到的大多数解决方案都涉及使用IServiceScopeFactory将作用域服务注入托管服务。我不想这样做,因为它使测试变得困难。使用 将我需要的服务注入到我的托管服务中会很好IServicesCollection,就像Startup.cs. 理想情况下是这样的:

# Program.cs
...
.ConfigureServices((hostContext, services) =>
{
    services.AddDbContext<MyContext>();
    services.AddSingleton<IOtherInjectedService, OtherInjectedService>();
    services.AddScoped<MyService>(); // <-- how does this work?
    services.AddHostedService<MyHostedService>();
});

# MyHostedService.cs
public class MyHostedService : IHostedService, IDisposable
{
    private readonly MyService _svc;

    public MyHostedService(MyService svc) 
    {
        _svc = svc;
    }

    public void DoWork() {
        _svc.Work();
    }
}

# MyService.cs
public class MyService
{
    private readonly MyContext _context;
    private readonly IOtherInjectedService _otherService;

    public void Work()
    {
        _otherService.Foo(_context);
    }
}

当我尝试在Program.cs. 我看到的是这个错误:

Cannot consume scoped service 'MyService' from singleton 'Microsoft.Extensions.Hosting.IHostedService'.

这是有道理的——单例不能使用范围服务。但看起来没有办法制作IHostedService范围。这是否意味着不使用作用域工厂就无法注入依赖项?我希望不是!至少可以说,这使测试变得困难。

在不使用? 的情况下将服务注入托管服务的正确方法是IServiceScopeFactory什么?

标签: c#.net.net-coredependency-injection

解决方案


推荐阅读