欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

将生命周期注册为Scoped的依赖项,注入到生命周期注册为Singleton的类中

程序员文章站 2024-02-20 08:13:58
...

将生命周期注册为Scoped的依赖项,注入到生命周期注册为Singleton的类中

点此查看原文

最近在项目中,结合Quartz.NET和IHostedService实现了.NET Core控制台的计划任务。在这个项目中,需要注入DbContext来进行数据库连接与操作。IServiceCollection的扩展方法AddDbContext是将DbContext注入为Scoped类型的生命周期的,而Quartz.NET要求我们将IJobFactoryISchedulerFactory注入为Singleton类型的。当我们在Singleton类型的类中直接注入Scoped类型的依赖项时,会抛出错误"不能在Singleton中使用Scoped类型的服务":

Cannot consume scoped service 'XXX' from singleton 'XXX'.

解决方案

在需要使用Scoped类型依赖项的类中,不直接注入此依赖项,而是注入IServiceScopeFactory依赖项:

public class MySingletonService : IMySingletonService
{
    private readonly IServiceScopeFactory _scopeFactory;

    public MySingletonService(IServiceScopeFactory scopeFactory)
    {
        _scopeFactory = scopeFactory;
    }
}

在需要使用Scoped类型依赖项的方法中,通过IServiceScopeFactory的实例解析此依赖项即可:

public class MySingletonService : IMySingletonService
{
    // Other code

    public void Scoped()
    {
        using var scope = _scopeFactory.CreateScope();
        var ctx = scope.ServiceProvider.GetRequiredService<MyDbContext>();

        // Other code
    }
}

参考

点此查看原文
原文首发于Chi Blog

相关标签: Asp.Net Core