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 lavoroevaluate("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 diMyComponent
con ogni invoke.creare un metodo di
dynamicMethod
in MyComponentmyComp.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.
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. –
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