2012-05-30 4 views
14

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

До сих пор единственным способом я нашел:

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

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

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

+0

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

+0

Кроме того, ReflectedControllerDescriptor использует отражение для получения действий, поскольку он не только рассматривает методы, но и атрибуты, связанные с этими методами. (ReflectedControllerDescriptor также кэширует результаты) – Buildstarted

+0

@BuildStarted, поэтому использование отражения внутри 'ReflectedControllerDescriptor' действительно кэшируется, но, возможно, я мог бы кэшировать мои вызовы FindAction? –

ответ

9

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

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

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