2012-10-24 12 views
8

Sto cercando il modo migliore per chiamare dinamicamente un metodo da un componente diverso in cfscript. Si noti che si tratta di un metodo in un diverso componente. Finora ho provato 3 metodi diversi, ma nessuno di loro sembra essere esattamente quello che sto cercando:Come chiamare dinamicamente un metodo da un componente diverso usando cfscript?

Tutti i casi sono scritti in cfscript all'interno di un metodo componente. Diciamo che sto provando a chiamare dinamicamente il metodo setName(required string name) nel componente MyComponent. Tutti i casi sono seguenti variabili definite:

var myComp = new MyComponent(); 
var myMethod = "setName"; 
var args = {"name"="foo"}; 
  • uso evaluate() per il lavoro

    evaluate("myComp.#myMethod#(argumentCollection=args)"); 
    

    pro: è fatto con poco codice molto
    contro: codice non è molto ' clean "e l'uso di evaluate() sembra avere una reputazione" cattiva "nella comunità online. Non vorrei che il mio codice fosse malvagio.

  • uso un wrapper per cfml <cfinvoke>

    invoke("MyComponent", myMethod, args); 
    

    pro: posso utilizzare tutte le funzionalità di cfinvoke
    contro: Si crea una nuova istanza di MyComponent con ogni invoke.

  • creare un metodo di dynamicMethod in MyComponent

    myComp.dynamicMethod(myMethod, args); 
    

    DynamicMethod di MyComponent:

    public any function dynamicMethod(required string methodName, required struct argumentColl){ 
        var cfcMethod = variables[arguments.methodName]; 
        return cfcMethod(argumentCollection=arguments.argumentColl); 
    } 
    

    pro: posso finalmente chiamare direttamente Mycomp. La soluzione più comoda finora.
    cons: Ora è possibile chiamare metodi privati ​​di MyComponent tramite dynamicMethod.
    (Ho anche provato la soluzione 'function as variable' al di fuori di MyComponent, ma poi la funzione perde il suo contesto di lavoro, ad esempio se MyComponent estenderebbe un componente, l'ambito 'super' non farebbe più riferimento al componente esteso) .

Nessuna di queste soluzioni sembra essere perfetta, quindi non c'è altro modo per chiamare una funzione dinamica da un controller diverso?
E se non c'è, qual è la soluzione migliore?

Qualsiasi consiglio è benvenuto, grazie.

+2

Non evitare qualcosa perché la gente sostiene che sia "malvagio". Ci sono ragioni per evitare di valutare, e dovresti imparare quello che sono, piuttosto che fidarti di affermazioni non corrette di cattiveria. –

+0

Perché non puoi semplicemente passare l'istanza del componente invece del suo nome in "invoke()" in modo che la stessa istanza venga riutilizzata ogni volta – niahoo

risposta

7

Buona analisi.

Una cosa che potresti fare qui è emulare più da vicino <cfinvoke> con la tua funzione wrapper.<cfinvoke> prenderà un percorso componente o un'istanza componente (es .: un oggetto) in quell'attributo COMPONENT. Quindi il tuo 'con' di 'Crea una nuova istanza di MyComponent ad ogni invoke'. non è veramente valido

ColdFusion 10, btw, aggiunge una funzione invoke() per ottenere solo questo. Ho notato che sei su CF9, quindi questo non ti aiuta. Ma forse è rilevante per le altre persone che potrebbero approdare a questa domanda.

+1

Grazie. Non ero a conoscenza del fatto che l'argomento componente di "" potrebbe essere un'istanza. Anche la funzione cf10 sembra promettente. Niente più wrapper :) – jan

Problemi correlati