Getting DbContext when resolving a singleton

喜你入骨 提交于 2019-12-01 22:57:33

问题


Within ConfigureServices I have

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

as well as

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

But s.GetService<MyContext>() throws an error:

Cannot resolve scoped service 'MyContext' from root provider.

How can I achieve that? I don't want to inject MyDbContext in MyModel contructor as it is in a library which should have no reason to know about Entity Framework.


回答1:


AddDbContext defaults to using a scoped lifestyle:

Scoped lifetime services (AddScoped) are created once per client request (connection).

The reason an error is being thrown is that you're attempting to obtain an instance of MyContext from outside of a request. As the error message suggests, it is not possible to obtain a scoped service from the root IServiceProvider.

For your purposes, you can create a scope explicitly and use that for your dependency resolution, like so:

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

This code above creates a scoped IServiceProvider that can be used for obtaining scoped services.



来源:https://stackoverflow.com/questions/46327364/getting-dbcontext-when-resolving-a-singleton

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!