解析单例时获取DbContext

时间:2017-09-20 16:32:00

标签: c# asp.net-core entity-framework-core

ConfigureServices我有

services.AddDbContext<MyContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

以及

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

但是s.GetService<MyContext>()会抛出错误:

无法从根提供程序解析作用域服务“MyContext”。

我怎样才能实现这一目标?我不想在MyDbContext构造函数中注入MyModel,因为它在一个库中,而该库应该没有理由知道Entity Framework

1 个答案:

答案 0 :(得分:8)

build_ext默认使用scoped生活方式:

  

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

抛出错误的原因是您尝试从请求外部获取AddDbContext的实例。如错误消息所示,无法从根MyContext获取作用域服务。

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

IServiceProvider

上面的代码创建了一个范围 services.AddSingleton<IMyModel>(sp => { using (var scope = sp.CreateScope()) { var dbContext = scope.ServiceProvider.GetService<MyContext>(); var lastItem = dbContext.Items.LastOrDefault(); return new MyModel(lastItem); } }); ,可用于获取范围的服务。