微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在异步操作中获取DbContext

如何解决在异步操作中获取DbContext

我正在将网站从ASP MVC重写/移动到ASP MVC Core。该应用程序具有一个动态菜单,该菜单取决于已登录用户。为了构建菜单,每个控制器都从一个自定义BaseController派生而来,后者在ViewBag菜单项中进行设置,稍后,在Layout中,这些项被检索并作为参数传递给PartialView

public BaseController:Controller
{
    public BaseController()
    {
          ...
          ViewBag.Menu=Utils.GetMenu();
          ...
    }
}

我不想使用与编写旧代码的家伙相同的逻辑。因此,我想使用ViewComponent来渲染菜单。但是我对这种方法有疑问。在调用方法中,我需要查询菜单项。现在,我从服务提供商(HttpContext.RequestServices)获得了一个DbContext实例,并使用它来查询所需的任何数据。但是从Layout异步调用了Invoke函数,我知道将DbContext发送到async方法不是很好:

<cache expires-after="@TimeSpan.FromHours(2)" enabled="true">
       @await Component.InvokeAsync(typeof(Admin.ViewComponents.MeniuViewComponent))
</cache>

这是一个方法吗?在Invoke方法(或任何其他async方法或操作)中使用DbContext(在Startup中注册为Scoped)并使用它是否安全?而且如果不是一个好主意,我该如何处理需要async方法从db获取数据的这种情况?

解决方法

在我的项目中,我有一个案例要从asp.net内核中的HostedService中获取DbContext。

我将IServiceProvider注入了构造函数中并构建了自己的作用域,以获取注册的DbContext:

private readonly IServiceProvider _serviceProvider;
public BaseController(IServiceProvider provider){
  _serviceProvider = provider;
}

private void DoSth(){
  using var scope = _serviceProvider.CreateScope();
  var db = scope.ServiceProvider.GetRequiredService<YOUR_DbContext_CLASS>();

  ... //do something great stuff here with the database
}
,

我认为您可以直接在ViewComponent中依赖注入DbContext

function high(scorel)
    local record,leaders = 0,{}
    for name,score in pairs(scorel) do
        if score > record then 
           record = score
           leaders = {name}
        elseif score == record then
           table.insert (leaders,name)
        end
    end
    return leaders,record
end
local leaders,record = high(score)
if #leaders > 0 then
    print ('Highest score (' .. tostring(record) .. ') belongs to ' .. concat (leaders,','))
end

有关更多详细信息,请参阅doc

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?