ActionDescriptor из ControllerContext
Учитывая, что у меня есть доступ только к ControllerContext
и не Action____Contexts
Каков оптимальный способ получить текущий исполняющий ActionDescriptor?
Пока единственный метод, который я нашел, это:
new ReflectedControllerDescriptor(context.Controller.GetType())
.FindAction(context, context.RouteData.GetRequiredString("action"));
Это оптимальный метод?
Тот факт, что класс назван ReflectedControllerDescriptor
заставляет меня задуматься, стоит ли эта операция дорого, так как она будет выполняться при каждом запросе страницы? С этим связано то, что этот класс внутренне кэшируется или я должен на самом деле кэшировать ReflectedControllerDescriptors
явно?
1 ответ
Выполнение некоторого поиска в исходном коде MVC - это почти наиболее оптимальный способ без копирования всех методов, необходимых для того, что вы уже делаете. Однако я не понимаю, почему вы не можете кэшировать найденные действия, чтобы последующие вызовы были более производительными.
внутренне ReflectedControllerDescriptor
также кэширует результаты, хотя кажется, что есть некоторые издержки, поскольку каждый раз проверяются все атрибуты. Похоже, для таких вещей, как HttpPostAttribute
и что "нет.
Мое предложение было бы придерживаться того, что вы используете, а не кэшировать это самостоятельно. Если по какой-то причине работает метод, лежащий в основе, изменится, вы уже в курсе, и вам не придется беспокоиться об изменении способа хранения кэшированных элементов.