ActionDescriptor из ControllerContext

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

Пока единственный метод, который я нашел, это:

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

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

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


person Chris Marisic    schedule 30.05.2012    source источник
comment
Покопаться в исходном коде MVC, что является наиболее оптимальным способом без копирования всех методов, необходимых для выполнения того, что вы уже делаете. Однако я не понимаю, почему вы не можете кэшировать найденные действия, чтобы последующие действия были более производительными.   -  person Buildstarted    schedule 31.05.2012
comment
Кроме того, ReflectedControllerDescriptor использует отражение для получения действий, поскольку он просматривает не только методы, но и атрибуты, прикрепленные к методам. (ReflectedControllerDescriptor также кэширует результаты)   -  person Buildstarted    schedule 31.05.2012
comment
@BuildStarted, поэтому использование отражения внутри ReflectedControllerDescriptor действительно кэшируется, но, возможно, я мог бы кэшировать свои вызовы FindAction?   -  person Chris Marisic    schedule 31.05.2012
comment
Да, ты мог бы. Существует еще некоторая дополнительная обработка атрибутов (даже с кэшированными действиями) в ReflectedControllerDescriptor, но она не требует интенсивного процесса.   -  person Buildstarted    schedule 31.05.2012


Ответы (1)


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

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

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

person Buildstarted    schedule 01.06.2012