解析单例时获取DbContext

Fra*_*ois 3 c# entity-framework-core asp.net-core

ConfigureServices我内心

services.AddDbContext<MyContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
Run Code Online (Sandbox Code Playgroud)

以及

services.AddSingleton<IMyModel>(s =>
{
    var dbContext = s.GetService<MyContext>();
    var lastItem= dbContext.Items.LastOrDefault();
    return new MyModel(lastItem);
});
Run Code Online (Sandbox Code Playgroud)

s.GetService<MyContext>()抛出一个错误:

无法从根提供程序解析作用域服务"MyContext".

我怎样才能做到这一点?我不希望注入MyDbContextMyModel构造器,因为它是应该没有理由知道一个图书馆Entity Framework.

Kir*_*kin 10

默认情况下,AddDbContext默认为Scoped生活方式:

每个请求创建一次范围生命周期服务.

抛出错误的原因很简单:您正在尝试获取MyContext请求之外的实例.

出于您的目的,您可以显式创建范围并将其用于依赖项解析,如下所示:

services.AddSingleton<IMyModel>(sp =>
{
    using (var scope = sp.CreateScope())
    {
        var dbContext = scope.ServiceProvider.GetService<MyContext>();
        var lastItem = dbContext.Items.LastOrDefault();
        return new MyModel(lastItem);
    }
});    
Run Code Online (Sandbox Code Playgroud)

更新:

为了帮助澄清尝试在请求之外获取MyContext的实例:正如错误消息所示,无法从根获取Scoped服务IServiceProvider.从我提供的代码中可以看出,您需要从Scoped获取Scoped服务. IServiceProvider