Я переписываю/перемещаю веб-сайт с ASP MVC на ASP MVC Core. Это приложение имеет динамическое меню, которое зависит от вошедшего в систему пользователя. Чтобы построить меню, каждый контроллер является производным от пользовательского BaseController
, который устанавливает ViewBag
пунктов меню, а позже, в Layout, эти элементы извлекаются и передаются в качестве аргументов PartialView
.
public BaseController:Controller
{
public BaseController()
{
...
ViewBag.Menu=Utils.GetMenu();
...
}
}
Я не хочу использовать ту же логику, что и парни, которые писали старый код. Поэтому я решил использовать ViewComponent
для рендеринга меню. Но у меня есть проблема с этим подходом. В методе Invoke мне нужно запросить пункты меню. Прямо сейчас я получаю экземпляр DbContext от поставщика услуг (HttpContext.RequestServices
) и использую его для запроса любых данных, которые мне нужны. Но функция Invoke вызывается асинхронно из Layout
и я знаю, что посылать DbContext в async
методы не очень хорошо:
<cache expires-after="@TimeSpan.FromHours(2)" enabled="true">
@await Component.InvokeAsync(typeof(Admin.ViewComponents.MeniuViewComponent))
</cache>
Хороший ли это подход? Безопасно ли получать DbContext (зарегистрированный как Scoped в Startup) в методе Invoke (или любом другом async
методе или действии) и использовать его? И если это не очень хорошая идея, как мне поступить в таких ситуациях, когда мне нужны данные из БД в async
методах?