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

11

我一直在探索不同的方法来构建我的ColdFusion应用程序,并寻求有关提供应用程序范围UDFs的最佳方法的意见。

对于我的每个应用程序,我通常使用一堆不真正属于任何特定对象的额外函数。主要是数据操作。 我希望这些函数在整个应用程序中都可用,既可以在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中。 我一直在尝试的另一种方法是在应用程序作用域中实例化我的基本Utils CFC,然后将其作为对象传递给其他CFC中的一个参数。 对我来说,这种方法在概念上和封装方面都有效。就像我会在我的init方法中设置我的数据源一样,我也可以使用我的UDFs做同样的事情。 这有同样的问题,即UDFs包含在每个CFC中。当我转储所有CFC时,我会多次获取每个UDF-但是由于我正在传递已实例化的对象,因此我假设它不会占用任何额外的内存空间。 如果有人能够确认这一点,那将很有帮助-我只是假设!

我对这种方法唯一的真正问题是它似乎有点复杂。

  • 让我的应用程序CFC继承我的Utils CFC。 这是许多框架似乎在做的事情。我没有使用过这种方法,但我肯定有优缺点。

  • 直接在Application.cfc中从单独的模板中CFInclude我的UDF 这在功能上类似于在应用程序作用域中实例化。

  • 将我的UDF添加到服务器的Components.cfc 理论上这是一个好主意 - 我可以维护一个基础Utils的副本,并确保服务器上的所有内容都可以访问它们 - 但是,如果我想要跨多个服务器运行应用程序,那么它们都需要这些函数。此外,对服务器的任何更新可能会覆盖这些组件。 这感觉就像是修改核心代码 - 我们都可以从痛苦的经历中确认,这是不好的。

  • 所以 - 我的问题是: 什么是以一种优雅且可重用的方式扩展CF与UDFs的最佳实践?以上任何选项或我没想到的东西?


    我建议不要使用上述任何一种方法。相反,将它们写入.cfm文件中,并在Application.cfc或需要它们的页面中进行cfinclude。根据它们是否涉及不同主题,您可能需要多个文件。 - Dan Bracuk
    不是选项5。按照你所写的方式,选项5要么只能使UDF对一个应用程序可用,要么让你面临代码重复的问题。 - Dan Bracuk
    对我来说,选项1似乎不错,但我不明白为什么你会说“我不喜欢在CFC内引用应用程序作用域。” - 你为什么需要这样做呢?也许这取决于你的函数在做什么,但你应该能够将任何作用域传递到你的CFC中以保持封装。 - duncan
    需要记住的一点是效率。如果你在application.cfc中的onrequeststart()函数中cfinclude udf文件,并且在某些页面上不使用任何函数,那么这将是低效的。这就是为什么我喜欢将cfincludes放在将要使用这些函数的cfm页面中的原因。 - Dan Bracuk
    1
    由于我在编写每个应用程序时都使用ColdSpring,因此我会创建一个由ColdSpring管理的CFc,并将“bean”包含在.cfm页面上,或将其连接到需要它的.cfc文件中。通常,在使用框架时,我有一些bean被包含在每个请求中...例如,我用于在整个应用程序中格式化日期等的“格式化器”bean。 - Scott Stroz
    显示剩余12条评论
    1个回答

    2
    如果您真的关心结构和保持事物独立,不要从单例或继承开始扩展功能。相反,在 ColdFusion 中通过在运行时/请求附加非组件库来扩展基本功能(请参阅 ColdFusion 开发人员指南)。这并不能神奇地解决所有问题,但至少这是实现通用功能的正确方式。

    我不确定我理解了。文档建议我将这些函数包含在请求范围内。从概念上讲,我不明白这与在应用程序范围内实例化有何不同。我的其他CFC仍然依赖于它的存在,并且必须在其自己的范围之外调用它们。我知道我不会使用这种方法进行实例化,但是有什么好处呢? - Gary Stanton
    文档并没有建议你将函数放在请求作用域中。它们只是向你展示了如果你希望这样做该怎么做。 - Dan Bracuk
    1
    好的,建议是我在运行时添加UDF而不是完全包含它们在CFC中。那么当我想在另一个CFC中使用其中一个时会发生什么?如果我必须在伪构造函数中包含包含UDF的.cfm文件,那对于封装来说不是很糟糕吗?我认为最好将文件位置作为init方法的参数 - 在这一点上,将UDF放在实例化的CFC中并将其作为参数传递是否更容易? - Gary Stanton

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接