2013-03-16 19 views
11

Ho esplorato diversi metodi di strutturazione delle applicazioni ColdFusion e sto cercando alcune opinioni sul modo migliore per fornire UDF a livello di applicazione.Estensione di ColdFusion con UDF a livello di applicazione

Per ciascuna delle mie app, in genere utilizzo un sacco di funzioni extra che non appartengono veramente a nessun oggetto particolare. Roba di manipolazione dei dati per lo più. Desidero che queste funzioni siano disponibili nell'intera applicazione, sia per l'utilizzo nei modelli CFM che nei CFC istanziati dell'applicazione.

Il mio modo di vedere ci sono vari metodi per ottenere questo, ma tutti hanno i loro limiti:

  1. istanziare una base Utils CFC nel perimetro di applicazione. Questo è il metodo che ho usato più spesso. Tutte le funzioni sono disponibili per tutte le applicazioni, ma se istanzio lo stesso CFC da più applicazioni, ognuna avrà il proprio ambito applicativo - il che significa che ognuno deve istanziare il proprio CFC di base Utils. Non c'è niente di sbagliato in questo, ma mi sembra di non incapsulare abbastanza bene la CFC. Non sono entusiasta di fare riferimento allo scope Application all'interno del CFC.

  2. Creare un CFC di base Util e fare in modo che ogni altro CFC lo estenda. Funziona bene e significa che CFC può fare riferimento alle funzioni di Util direttamente dal CFC THIS scope - Tuttavia, significa che le funzioni Utils vengono mantenute in memoria per ogni CFC. Anche non concettualmente si concentra come i miei altri CFC non hanno alcuna relazione con il CFC Utils.

  3. Iniettare il mio CFC di base Util negli altri CFC. Un altro metodo con cui ho giocato è la creazione di istanze del mio CFC di base nell'ambito dell'applicazione, ma poi il passaggio come oggetto a un argomento negli altri CFC. Questo funziona per me concettualmente e per l'incapsulamento. Nello stesso modo in cui imposterò le mie origini dati nel mio metodo init, posso fare lo stesso con le mie UDF. Questo ha lo stesso problema che le UDF sono incluse in ogni CFC. Quando scarico tutti i miei CFC ottengo più volte ciascuna UDF. Tuttavia, mentre sto passando un oggetto istanziato, presumo che non occupi spazio extra di memoria. Se qualcuno potesse confermarlo, sarebbe utile - sto solo dando per scontato! L'unico vero problema che ho con questo metodo è che sembra un po 'contorto.

  4. La mia applicazione CFC estende il mio CFC Utils. Questo è quello che sembrano fare molti quadri. Non ho usato questo metodo, ma sono sicuro che ci sono pro e contro.

  5. CFIncludere le mie UDF da modelli separati, direttamente in Application.cfc Questo è funzionalmente simile all'istanza nell'ambito applicazione.

  6. Aggiungi miei UDF al server Components.cfc E 'una grande idea in teoria - che può mantenere una copia dei Utils di base ed essere sicuri che tutto sul server può accedervi - Tuttavia, se voglio eseguire applicazioni in tutta più server allora avranno tutti bisogno di quelle funzioni. Inoltre, qualsiasi aggiornamento al server potrebbe sovrascrivere i componenti. Sembra proprio come se l'hacking del core - che sono sicuro che tutti noi possiamo ottenere da un'esperienza amara, è male.

Così - la mia domanda è questa: Qual è la migliore pratica per estendere CF con UDF in modo elegante e riutilizzabile? Qualcuna delle opzioni di cui sopra o qualcosa a cui non ho pensato?

+0

Non suggerisco nessuna delle precedenti. Invece, scriverli in file .cfm e includerli in Application.cfc o nelle pagine che ne hanno bisogno. Potresti voler avere più di un file, a seconda che siano o meno su argomenti diversi. –

+0

Non è questa l'opzione 5? Il problema è che anche gli altri CFC non sono incapsulati: dovrebbero fare riferimento allo scope Application quando chiamano le funzioni. –

+0

Non è l'opzione 5. L'opzione 5 così come è stata scritta potrebbe rendere l'udf disponibile per una sola applicazione o sottoporla alla ripetizione del codice. –

risposta

1

Se si è veramente interessati alla struttura e si mantengono le cose indipendenti, non iniziare nemmeno con singoletti o ereditarietà che estendono la funzionalità. Estendi invece la funzionalità di base all'interno di ColdFusion accodando la libreria non componente su runtime/request, see ColdFusion Developer's Guide. Questo non risolve magicamente tutti i problemi, ma almeno questo è il modo corretto per implementare funzioni generiche.

+0

Non sono sicuro di aver capito. I documenti suggeriscono che includo quelle funzioni nell'ambito della richiesta. Concettualmente non vedo come ciò differisca dall'istanza nell'ambito dell'applicazione. I miei altri CFC continuerebbero a fare affidamento sulla loro presenza e a chiamarli al di fuori del loro ambito di applicazione. Vedo che non vorrei creare istanze con questo metodo, ma qual è il vantaggio? –

+0

I documenti non suggeriscono di inserire la tua funzione nell'ambito della richiesta. Ti stanno mostrando come farlo se lo desideri. –

+0

Ok, quindi il suggerimento è di aggiungere UDF in fase di esecuzione e di non includerle affatto in un CFC. Cosa succede quando voglio usarne uno all'interno di un altro CFC? Se devo includere il file .cfm contenente le UDF nel pseudo costruttore, non è così male per l'incapsulamento? Avrei pensato che fosse meglio avere la posizione del file come argomento per il metodo init - a che punto non è più semplice avere le UDF in un CFC istanziato e passarlo come argomento? –