Question

Dans le code de mon entreprise, je l'ai souvent vu des fichiers de composants utilisés par l'initialisation d'un objet de ce composant et appeler les méthodes sur l'objet. Cependant, il me semble un peu plus facile à utiliser la méthode cfinvoke, en particulier lorsque vous utilisez une seule méthode à partir du fichier composant. Quelles sont les différences entre ces 2 méthodes d'appel fonction des composants et quels sont les avantages / inconvénients de chacun? Quand dois-je utiliser qui?

Était-ce utile?

La solution

cfinvoke ne peut être utilisé dans les balises.

createObject peut être utilisé dans les deux balises et cfscript et a tendance à être un peu plus mince / plus facile à lire l'OMI.

Jusqu'à récemment, j'évité d'utiliser cfinvoke parce que je l'ai trouvé « encombrant », mais un pro de celui-ci est que vous pouvez boucle dynamiquement sur les méthodes dans un CFC. Dans createobject vous ne pouvez pas.

Donc, si par exemple, j'ai un CFC qui a les méthodes - method1, method2, MÉTHODE3, method4. Je boucle peut sur eux comme ceci: -

<cfloop from="1" to="4" index="element">
   <cfif structKeyExists(this,'getMethod#element#')>
<cfinvoke component="#this#" method="getLine#local.element#" returnVariable="methodValue"></cfinvoke>
<cfset arrayAppend(myArray,methodValue) />
   </cfif>

-

Une autre chose à noter est que certains hôtes de partage verrouillent sur createobject. Principalement en raison de l'accès qu'il donne à la Java soulignement.

Autres conseils

Un autre avantage d'utiliser createObject() est que vous pouvez enchaîner la méthode init(), par exemple.

<cfset myObject = createObject("com.path.MyObject").init() />

Et si vos déclarations de init() this vous pouvez aller plus loin et la chaîne de la méthode si vous n'avez pas besoin d'utiliser à nouveau l'objet:

<cfset functionResults = createObject("com.path.MyObject").init().myFunction() />

Il est intéressant de souligner que CF 9 vous pouvez utiliser la nouvelle (ahem) syntaxe new pour créer des objets. Par exemple, pour créer le même objet que ci-dessus et l'appeler est init() Je peux écrire:

<cfset myObject = new com.path.MyObject() />

Il est propre et j'aime la possibilité de le faire. CF se déplace dans la bonne direction, à mon avis avec des fonctionnalités comme celui-ci.

Vous avez presque répondu vous-même: à la surface, on pourrait dire que si vous appellerez qu'une seule méthode sur une page, puis faire en un seul coup dans cfinvoke (qui instancie le CFC et appelle la méthode nommée ) sens. Et certainement si vous appelleriez plus d'une méthode de la CFC sur une page, puis en séparant les étapes sens (instancier le CFC avec la fonction CreateObject ou tag cfobject, appelez alors les méthodes que l'on trouve dans cet objet, un pointeur vers le CFC) , de sorte que vous ne payez pas instanciation coûter plus d'une fois.

Mais gardez à l'esprit que si la page est souvent appelé, il peut être judicieux aussi de sauver ce résultat d'instancier le CFC, afin qu'il puisse être réutilisé sur une demande ultérieure à la page. Vous faire en les stockant (le résultat de cfobject / createobject) pas dans une variable locale, mais plutôt dans un champ commun: si le serveur, l'application ou session, sur la base « qui » bénéficierait d'une telle réutilisation. Bien sûr, il est alors vous incombe de gérer par programme / décider combien de temps pour enregistrer cette « cache » instance CFC.

Aussi important, lorsque vous enregistrez une instance CFC cette façon, vous devenez plus sensible à la « portée var bug », qui est en fait que vous devez être encore plus prudent de VAR toutes les variables locales que vous créez dans le CFC. Plutôt que d'essayer d'élaborer plus à ce sujet, je signale une méta-ressources que j'ai créé sur ce point:

http://www.carehart.org/ blog / client / index.cfm / 2010/3/4 / resources_on_the_var_scope_problem

L'espoir qui aide.

plutôt ressasser ensuite cette discussion, je vous indiquerons simplement vous vers Google:

http://www.google.com/search?q=cfinvoke+ vs + createobject

Il y a quelques différences subtiles (IE: <cfinvoke> est capable de gérer les noms de méthodes dynamiques) mais essentiellement, il se résume simplement à vos préférences personnelles. Eh bien, et le fait que vous ne pouvez pas utiliser <cfinvoke>via <cfscript>.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top