2012-05-30 5 views
14

Dado que tengo acceso solo a ControllerContext y no a Action____Contexts, ¿cuál es la forma óptima de obtener Action Discriptor en ejecución?ActionDescriptor from ControllerContext

Hasta ahora, el único método que he encontrado es:

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

es éste el método óptimo?

El hecho de que la clase se llame ReflectedControllerDescriptor me lleva a preguntarme si esta operación tiene un costo elevado, ya que se ejecutará en cada solicitud de página. En relación con esto es lo hace esta clase internamente caché o debería ser en realidad el almacenamiento en caché ReflectedControllerDescriptors explícitamente?

+0

Investigar en la fuente MVC es la manera más óptima sin copiar todos los métodos necesarios para hacer lo que ya está haciendo. Sin embargo, no veo por qué no podría almacenar en caché las acciones encontradas para que las acciones posteriores sean más efectivas. – Buildstarted

+0

Además, ReflectedControllerDescriptor utiliza el reflejo para obtener Acciones, ya que no solo mira los métodos sino también los atributos asociados a los métodos. (el ReflectedControllerDescriptor también almacena en caché los resultados) – Buildstarted

+0

@BuildStarted, por lo que el uso de la reflexión dentro de 'ReflectedControllerDescriptor' está almacenado en la memoria caché, pero posiblemente podría almacenar en caché mis llamadas a FindAction. –

Respuesta

9

Haciendo un poco de excavación en la fuente de MVC que es más o menos la forma más óptima sin necesidad de copiar todos los métodos necesarios para hacer lo que ya está haciendo. Sin embargo, no veo por qué no podría almacenar en caché las acciones encontradas para que las llamadas posteriores sean más efectivas.

Internamente ReflectedControllerDescriptor también almacena en caché los resultados, aunque parece que hay un poco de sobrecarga, ya que comprueba todos los atributos cada vez. Parece ser para cosas como HttpPostAttribute y lo que no.

Mi sugerencia sería la de seguir con lo que está utilizando en lugar de caché por sí mismo. Si, por alguna razón, la forma en que el método subyacente trabaja cambios que está al día y la costumbre ya' tiene que preocuparse de cambiar la forma en que almacena los elementos almacenados en caché.