ActionDescriptor из ControllerContext

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

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

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

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

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

1 ответ

Решение

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

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

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

Другие вопросы по тегам