我一直在探索构建我的 ColdFusion 应用程序的不同方法,并且我正在寻找一些关于提供应用程序范围的 UDF 的最佳方式的意见。
对于我的每个应用程序,我通常会使用一些不属于任何特定对象的额外功能。主要是数据操作的东西。我希望这些函数在我的整个应用程序中都可用,既可用于 CFM 模板,也可用于应用程序实例化的 CFC。
在我看来,有多种方法可以实现这一点,但它们都有自己的局限性:
在 Application 范围内实例化一个基本的 Utils CFC。这是我最常用的方法。所有功能都可以在应用程序范围内使用,但是如果我从多个应用程序实例化相同的 CFC,那么它们每个都有自己的应用程序范围 - 这意味着每个函数都必须实例化自己的基本 Utils CFC。这没有什么问题,但感觉就像我对 CFC 的封装不够好。我不热衷于从 CFC 中引用应用程序范围。
创建一个基本的 Utils CFC 并使所有其他 CFC 扩展它。这工作正常,这意味着 CFC 可以直接从 CFC 的 THIS 范围引用 Utils 函数 - 但是这意味着 Utils 函数保存在每个 CFC 的内存中。它在概念上也不正确,因为我的其他 CFC 与 Utils CFC 没有关系。
将我的基本 Utils CFC 注入我的其他 CFC。我一直在使用的另一种方法是在应用程序范围内实例化我的基本 Utils CFC,然后将其作为对象传递给我的其他 CFC 中的参数。这在概念上和封装上对我有用。就像我将在我的 init 方法中设置我的数据源一样,我可以对我的 UDF 做同样的事情。这与 UDF 包含在每个 CFC 中的问题相同。当我转储所有 CFC 时,我多次获得每个 UDF - 但是当我传递一个实例化对象时,我假设它不会占用任何额外的内存空间。如果有人能证实这一点,那会很有帮助——我只是假设!我对这种方法唯一真正的问题是它看起来有点复杂。
让我的应用程序 CFC 扩展我的 Utils CFC。这似乎是很多框架所做的。我没有使用过这种方法,但我确信有利有弊。
CF 直接在 Application.cfc 中包含来自单独模板的我的 UDF 这在功能上类似于在 Application 范围内实例化。
将我的 UDF 添加到服务器的
Components.cfc
理论上这是一个好主意 - 我可以维护基本 Utils 的一个副本并确保服务器上的所有内容都可以访问它们 - 但是,如果我想跨多个服务器运行应用程序,那么它们将全部需要这些功能。此外,对服务器的任何更新都可能覆盖组件。感觉就像破解核心一样——我相信我们都可以从痛苦的经历中证明这一点,是不好的。
所以 - 我的问题是:以优雅和可重用的方式使用 UDF 扩展 CF 的最佳实践是什么?上述任何选项还是我没有想到的?