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
。
答案 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);
}
});
,可用于获取范围的服务。