ActionDescriptor из ControllerContext

Учитывая, что у меня есть доступ только к ControllerContext, а не Action____Contexts, каков оптимальный способ получить текущий исполняемый ActionDescriptor?

Пока единственный найденный мной метод:

new ReflectedControllerDescriptor(context.Controller.GetType())
    .FindAction(context, context.RouteData.GetRequiredString("action"));

Это оптимальный метод?

Тот факт, что класс называется ReflectedControllerDescriptor, заставляет меня задаться вопросом, есть ли высокая стоимость для этой операции, поскольку она будет выполняться при каждом запросе страницы? Связано это с тем, является ли этот класс внутренним кешем или я действительно должен кэшировать ReflectedControllerDescriptors явно?

Ответы

Ответ 1

Выполнение некоторых копаний в источнике MVC, что почти самый оптимальный способ без копирования всех методов, необходимых для выполнения того, что вы уже делаете. Однако я не понимаю, почему вы не могли кэшировать найденные действия, чтобы последующие вызовы были более эффективными.

Внутренне ReflectedControllerDescriptor также кэширует результаты, хотя, кажется, немного накладных расходов, так как каждый раз проверяет все атрибуты. Это похоже на вещи типа HttpPostAttribute, а что нет.

Мое предложение - придерживаться того, что вы используете, а не кэшировать его самостоятельно. Если по какой-то причине способ, которым работает базовый метод, вы уже обновляетесь, и вам не придется беспокоиться об изменении способа хранения кэшированных элементов.