使用应用程序范围的UDF扩展ColdFusion

时间:2013-03-16 16:49:29

标签: coldfusion cfc railo cfml

我一直在探索构建我的ColdFusion应用程序的不同方法,我正在寻找关于提供应用程序范围UDF的最佳方法的一些意见。

对于我的每个应用程序,我通常使用一堆并非真正属于任何特定对象的额外函数。主要是数据操作。 我希望这些功能在我的应用程序中可用,既可用于CFM模板,也可用于应用实例化的CFC。

我看到它的方法有多种实现方法,但它们都有其自身的局限性:

  1. 在应用程序范围中实例化基本Utils CFC。 这是我经常使用的方法。所有的功能都可以在应用程序范围内使用,但如果我从多个应用程序实例化相同的CFC,那么它们每个都有自己的应用程序范围 - 这意味着每个都必须实例化自己的基础Utils CFC。 这没有什么不对,但感觉我没有足够好地封装CFC。我并不热衷于从CFC中引用应用程序范围。

  2. 创建一个基础Utils CFC并使其他所有CFC扩展它。 这样可以正常工作,这意味着CFC可以直接从CFC的THIS范围引用Utils功能 - 但这意味着Utils功能保存在每个CFC的内存中。 它在概念上也不合适,因为我的其他CFC与Utils CFC没有任何关系。

  3. 将我的基础Utils CFC注入我的其他CFC。 我一直在玩的另一种方法是在Application范围中实例化我的基础Utils CFC,然后将其作为对象传递给我的其他CFC中的参数。 这在概念上和我的封装中都适用。与我在init方法中设置数据源的方式相同,我可以对UDF执行相同的操作。 这与UDF包含在每个CFC中的问题相同。当我转储所有的CFC时,我多次得到每个UDF - 但是当我传递一个实例化的对象时,我假设它没有占用任何额外的内存空间。 如果有人能证实这一点,那会很有帮助 - 我只是假设! 我对这种方法唯一真正的问题是它似乎有点复杂。

  4. 让我的应用程序CFC扩展我的Utils CFC。 这就是许多框架似乎要做的事情。我没有使用过这种方法,但我确信它有利有弊。

  5. CF直接在Application.cfc中从单独的模板中包含我的UDF 这在功能上类似于在应用程序范围中实例化。

  6. 将我的UDF添加到服务器的Components.cfc 理论上这是一个好主意 - 我可以保留基本Utils的一个副本,并确保服务器上的所有内容都可以访问它们 - 但是,如果我想在多个服务器上运行应用程序,那么它们都需要这些功能。此外,对服务器的任何更新都可能会覆盖组件。 这只是感觉就像黑客攻击核心一样 - 我确信我们可以从苦涩的经历中得到最好的结果,这很糟糕。

  7. 所以 - 我的问题是: 使用UDF以优雅和可重用的方式扩展CF的最佳实践是什么?以上任何一种选择或者我没想过的东西?

1 个答案:

答案 0 :(得分:1)

如果您真的关心结构并保持事物独立,那么甚至不要从扩展功能的单例或继承开始。而是通过在运行时/请求see ColdFusion Developer's Guide上附加非组件库来扩展ColdFusion中的基本功能。这并没有神奇地解决所有问题,但至少这是实现通用功能的正确方法。