编写特定于引擎的CFML代码的最佳方法是什么?

时间:2009-11-05 23:28:27

标签: coldfusion railo openbd

由于实施方面的差异,有时需要为Adobe ColdFusion与Railo和OpenBD编写不同的代码。

人们是否有一个他们用于此的特定方法?

例如,启用ProductName是一个选项:

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

这是最好的方式,还是有人可以提出更好的建议?

2 个答案:

答案 0 :(得分:4)

当你了解它时,这可能是最可靠的方式。您可能更安全地进行特征检测而不是明确的产品检查,但CFML没有很多可用于此类事物的内省功能。

如果您在工作中使用CFC,那么您还可以使用StrategyTemplate Method等模式隐藏其中一些替代实施。但是当你选择一个实现时,你可能仍会回到ProductName

答案 1 :(得分:4)

我认为更好的方法是为每个引擎创建一个cfc,并在每个cfc中创建匹配的方法名称。然后你可以做的是调用cfc并根据引擎运行方法。您可以在onapplicationstart()事件中使用switch语句来设置应用程序范围的变量来初始化和存储特定于引擎的cfc。一个小例子是:

<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()>

然后在你的代码中你所要做的就是:

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

授予它仍然不是最漂亮的解决方案,但至少你将在一个地方包含所有引擎特定的代码,而不是用开关逻辑乱丢你的代码库。