2012-05-30 12 views
14

Dato che ho accesso solo a ControllerContext e non a Action____Contexts qual è il modo ottimale per ottenere l'ActionDescriptor di esecuzione corrente?ActionDescriptor da ControllerContext

Finora l'unico metodo che ho trovato è:

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

È questo il metodo ottimale?

Il fatto che la classe sia denominata ReflectedControllerDescriptor mi porta a chiedermi se vi è un costo elevato per questa operazione poiché verrà eseguita su ogni richiesta di pagina? In relazione a ciò, questa classe internamente memorizza nella cache o dovrei effettivamente memorizzare nella cache ReflectedControllerDescriptors in modo esplicito?

+0

Fare qualche ricerca nella sorgente MVC è praticamente il modo più ottimale senza copiare tutti i metodi necessari per fare ciò che si sta già facendo. Tuttavia, non vedo perché non è possibile memorizzare nella cache le azioni trovate in modo che le azioni successive siano più performanti. – Buildstarted

+0

Inoltre ReflectedControllerDescriptor utilizza la reflection per ottenere Actions poiché non considera solo i metodi ma anche gli attributi associati ai metodi. (il ReflectedControllerDescriptor memorizza anche i risultati nella cache) – Buildstarted

+0

@BuildStarted in modo che l'uso della riflessione all'interno di 'ReflectedControllerDescriptor' sia effettivamente memorizzato nella cache, ma probabilmente potrei memorizzare le mie chiamate su FindAction? –

risposta

9

Fare qualche ricerca nella sorgente MVC è praticamente il modo migliore senza copiare tutti i metodi necessari per fare ciò che si sta già facendo. Tuttavia, non vedo perché non è stato possibile memorizzare nella cache le azioni trovate in modo che le chiamate successive siano più performanti.

Anche internamente ReflectedControllerDescriptor memorizza nella cache i risultati anche se sembra che ci sia un po 'di overhead poiché controlla tutti gli attributi ogni volta. Sembra essere per cose come HttpPostAttribute e cosa no.

Il mio suggerimento sarebbe quello di attenersi a ciò che si sta utilizzando piuttosto che memorizzarlo da soli. Se, per qualche motivo, il modo in cui il metodo sottostante funziona cambia sei già aggiornato e non dovrai preoccuparti di cambiare il modo in cui memorizzi gli elementi memorizzati nella cache.

Problemi correlati