将应用程序的用户定义函数包含到模块中

Including Application's user-defined-functions into modules

我出于简化目的的申请有

结果是 10 个模块中的每一个都将整个 functions.cfm 复制到每个模块中。

我重新设计,将函数变成一个组件(它被命名为 application._,它被复制到每个模块内部的 variarables._ 并调用像 _.myUDF() 这样的函数应该通过引用 application._ 调用 而不是为每个组件重新创建文件中的每个函数。

这应该是最快最轻便的方法,不是吗?任何人都可以建议增强这种风格,或者给出为什么 include 可能更可取的原因,如果我更改组件的添加功能 functions.cfc?

则不需要重新创建组件

使用 include 方法应该(据我所知)允许您对文件进行即时更新,并让它们立即反映出来而无需重新启动应用程序。将它们作为对象存储在 application scope 中时,需要重新启动应用程序才能刷新它们。但是有这个能力重要吗?在生产环境中频繁更改代码通常是不好的做法。

functions.cfm 加载到变量中会将其放入内存中,这意味着只要应用程序处于 运行,它就会存在。它会使用更多的长期资源,但也会使它们更快地访问。虽然使用 include 会长期使用较少的资源,但每次调用 CFCs 之一调用它时都必须加载 functions.cfm;让它变慢,并可能消耗更多的短期资源。

"best" 选择更多取决于哪个功能对您的设置更重要。

我也很好奇你为什么把application.functions转给variables.functions。只要 functions.cfm 中的方法不写入应用程序范围——它应该被锁定在方法的本地级别——你应该能够在应用程序范围内简单地引用它们。

如果我没理解错的话,您已经将所有函数从 functions.cfm 移动到名为 functions.cfc 的组件了吗?所以你的 functions.cfc 看起来像这样:

component {

    function doSomething()    { ... }
    function doAnotherThing() { ... }
    ...

}

现在让我们转到初始化组件的地方:

// create an instance of your "functions" component.
helperFunctions          = new functions();

// pass this instance to the others components using the constructor
// (components are passed by reference, so make sure your "functions" component is stateless)
application.o.items      = new cfcs.items(helperFunctions);
application.o.categories = new cfcs.categories(helperFunctions);

你的 items.cfccategories.cfc 应该是这样的:

component {

    function init(functionsInstance) {

        // keep the reference to the "functions" component
        variables._ = arguments.functionsInstance;
    }

    function someFunction() {

        // use the passed "functions" component's functions
        variables._.doSomething();
        variables._.doAnotherThing();
    }

    ...

}

现在,如果您更改组件中的某些内容,您只需再次 运行 "initialize routine"。这将 update/override 组件存储在 application.o 结构中。因此,将这些行放在一个单独的文件中,以便在应用程序启动时包含在您需要实时更新时调用的 "restart" 模板中。

您的文件 functions.cfm 包含在您的 CFC 文件中,因此您可以在任何这些 CFC 中调用 functionA()

如果您转换为 functions.cfc 并将该对象注入您的其他 CFC,那么您必须在其他 CFC 文件中引用 functions 对象:

<cfset functions.functionA()>

所以有很多代码需要重构。

似乎您应该 extend 您现有的 CFC functions.cfc

<cfcomponent extends="cfc.functions">

这会使您的其他组件成为 functions.cfc 子对象 ,因此继承了 functions.cfc 的内容.现在,从任何子 CFC 中,您都可以像包含 functions.cfm 时那样调用 functionA()

如果这更符合您的要求,并且您希望所有 CFC 都包含这些功能,您可以完全 baller 移动并更新您的 CF 服务器的核心 component.cfc,所有 CFC 都从中扩展。该文件应该可以在 <CF_ROOT>\WEB-INF\cftags 中找到。我过去这样做是为了向 ColdBox 应用程序添加额外的 "native" 功能。只需确保在源代码管理中跟踪这些更改即可。