2

有时,由于实现的差异,需要为 Adob​​e ColdFusion、Railo 和 OpenBD 编写不同的代码。

人们有为此使用的特定方法吗?

例如,打开 ProductName 是一种选择:

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

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

4

2 回答 2

4

当你认真对待它时,这可能是最可靠的方法。进行特征检测而不是明确的产品检查可能更安全,但是 CFML 没有很多可用于此类事情的自省功能。

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

于 2009-11-05T23:42:47.917 回答
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)>

授予它仍然不是最漂亮的解决方案,但至少您将在一个地方包含所有引擎特定的代码,并且不会在您的代码库中乱扔切换逻辑。

于 2009-11-06T16:10:41.773 回答