【发布时间】:2021-01-29 07:30:06
【问题描述】:
我正在重写/将网站从 ASP MVC 移动到 ASP MVC Core。此应用程序有一个取决于登录用户的动态菜单。为了构建菜单,每个控制器都从一个自定义的BaseController 派生,该BaseController 设置了ViewBag 菜单项,稍后,在布局中,这些项目被检索并作为参数传递给PartialView。
public BaseController:Controller
{
public BaseController()
{
...
ViewBag.Menu=Utils.GetMenu();
...
}
}
我不想使用与编写旧代码的小伙子相同的逻辑。所以我想用ViewComponent 来渲染菜单。但我对这种方法有疑问。在调用方法中,我需要查询菜单项。现在,我从服务提供者 (HttpContext.RequestServices) 获得了一个 DbContext 实例,并使用它来查询我需要的任何数据。但是Invoke函数是从Layout异步调用的,我知道将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数据的情况?
【问题讨论】:
-
看起来您没有将表示层与数据层分开。你有存储库来操作数据库数据和服务来处理一些业务逻辑吗?在视图内不进行任何类型的数据库调用是一种常见的方法。您必须准备好所有数据并将其发送到您拥有的视图中。
-
是的,我有。但是在存储库中,我尝试从缓存中获取数据(我使用 MemoryCache),如果它未命中,我会从数据库中获取它们。无论如何,视图组件不应该提供动作样式支持吗?我不是试图从 View 中获取数据,而是尝试从 Invoke 函数中获取数据。
标签: c# asp.net-core async-await entity-framework-core asp.net-core-viewcomponent