2009-11-05 20 views
2

Parfois, il est nécessaire d'écrire un code différent pour Adobe ColdFusion vs Railo vs OpenBD, en raison de différences dans l'implémentation.Quelle est la meilleure façon d'écrire du code CFML spécifique au moteur?

Est-ce que les gens ont une méthode spécifique qu'ils utilisent pour cela?

Par exemple, la mise sous tension ProductName est une option:

<cfswitch expression="#Server.ColdFusion.ProductName#"> 
    <cfcase value="ColdFusion Server"> 
     ... 
    </cfcase> 
    <cfcase value="Railo"> 
     ... 
    </cfcase> 
    <cfcase value="BlueDragon"> 
     ... 
    </cfcase> 
</cfswitch> 

Est-ce que la meilleure façon, ou peut-on suggérer quelque chose de mieux?

+0

J'ai seulement développé pour courir sur le serveur de Coldfusion. Quelles sont les différences dans les serveurs d'applications que l'on devrait coder? – Jay

+0

Dans la plupart des cas, il n'y a pas de quoi s'inquiéter, puisque Railo et OpenBD sont généralement compatibles avec les fonctionnalités d'ACF. Le problème vient quand il y a un bug dans l'un d'entre eux, qui doit être travaillé de manière à interrompre ou ralentir les moteurs sans le bug. La gestion par ACF de 'expandPath' relève de cette catégorie dans certaines situations (par exemple, lorsqu'elle est appliquée à des chemins absolus, ou en utilisant des barres obliques de fin sur Apache). [suite ...] –

+0

Je suppose que cette situation peut également se produire avec des fonctionnalités spécifiques au fournisseur. (Par exemple, vous utilisez peut-être une bibliothèque tierce avec ACF/OpenBD pour imiter cfvideo de Railo, mais si cette bibliothèque ne possède pas l'une des fonctionnalités de cfvideo, vous ne voudrez pas l'utiliser dans tous les cas. à cela à travers tous les moteurs.) –

Répondre

4

Quand vous y parvenez, c'est probablement le moyen le plus fiable. Vous pouvez être plus sûr de faire la détection des fonctionnalités plutôt que des vérifications de produits explicites, mais CFML n'a pas beaucoup de fonctionnalités d'introspection que vous pouvez utiliser pour ce genre de choses. Si vous utilisez des CFC dans votre travail, vous pouvez également masquer certaines de ces implémentations alternatives en utilisant des modèles comme Strategy et Template Method. Mais lorsque vous choisissez une implémentation, vous reviendrez probablement à ProductName.

4

Je pense qu'une meilleure façon de gérer cela serait de créer un cfc pour chaque moteur et un nom de méthode correspondant dans chaque cfc. alors ce que vous pouvez faire est d'invoquer ce cfc et d'exécuter la méthode en fonction du moteur. Vous pouvez utiliser votre instruction switch dans l'événement onapplicationstart() pour définir une variable d'application large afin d'initialiser et de stocker le cfc spécifique au moteur. un petit exemple serait:

<cfset loc.engine = "adobe"> 
<cfswitch expression="#Server.ColdFusion.ProductName#"> 
    <cfcase value="Railo"> 
     <cfset loc.engine = "railo"> 
    </cfcase> 
    <cfcase value="BlueDragon"> 
     <cfset loc.engine = "openbd"> 
    </cfcase> 
</cfswitch> 

<cfset application.engine = createobject("component", "engines.#loc.engine#").init()> 

alors dans votre code tout ce que vous avez à faire:

<cfset myvar = application.engine.somemethod(arguments)> 

lui a accordé est toujours pas la plus jolie solution, mais au moins vous serez contenant tous les spécifiques du moteur codez au même endroit et ne détruisez pas votre base de code avec la logique de commutation.