我一直在探索不同的方法来构建我的ColdFusion应用程序,并寻求有关提供应用程序范围UDFs的最佳方法的意见。
对于我的每个应用程序,我通常使用一堆不真正属于任何特定对象的额外函数。主要是数据操作。 我希望这些函数在整个应用程序中都可用,既可以在CFM模板中使用,也可以在应用程序实例化的CFC中使用。
我认为,有各种方法可以实现此目的,但它们都具有自己的局限性:
在应用程序作用域中实例化一个基本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方法中设置我的数据源一样,我也可以使用我的UDFs做同样的事情。 这有同样的问题,即UDFs包含在每个CFC中。当我转储所有CFC时,我会多次获取每个UDF-但是由于我正在传递已实例化的对象,因此我假设它不会占用任何额外的内存空间。 如果有人能够确认这一点,那将很有帮助-我只是假设!
让我的应用程序CFC继承我的Utils CFC。 这是许多框架似乎在做的事情。我没有使用过这种方法,但我肯定有优缺点。
直接在Application.cfc中从单独的模板中CFInclude我的UDF 这在功能上类似于在应用程序作用域中实例化。
将我的UDF添加到服务器的Components.cfc
理论上这是一个好主意 - 我可以维护一个基础Utils的副本,并确保服务器上的所有内容都可以访问它们 - 但是,如果我想要跨多个服务器运行应用程序,那么它们都需要这些函数。此外,对服务器的任何更新可能会覆盖这些组件。
这感觉就像是修改核心代码 - 我们都可以从痛苦的经历中确认,这是不好的。
所以 - 我的问题是: 什么是以一种优雅且可重用的方式扩展CF与UDFs的最佳实践?以上任何选项或我没想到的东西?