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".
我怎样才能做到这一点?我不希望注入MyDbContext的MyModel构造器,因为它是应该没有理由知道一个图书馆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
| 归档时间: |
|
| 查看次数: |
3462 次 |
| 最近记录: |