将应用程序的用户定义功能包含到模块中

时间:2018-07-17 18:41:48

标签: coldfusion cfml lucee

我出于简化目的的申请

  • 应用
    • 包括functions.cfm
    • 缓存对象application.o
      • cfcomponent个模块,每个模块都具有创建/更新/查看模型类型的功能
        • 每个组件都包含functions.cfm,以便它可以使用它们,从而导致每个模块都包含它们不使用的UDF。
        • 一个例子是
          • application.o.items = new cfcs.items()
            • 包括functions.cfm
          • application.o.categories = new cfcs.categories()
            • 包括functions.cfm

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

我已经进行了重新设计,将函数变成一个组件(名为application._,将其复制到每个模块内的variarables._中,并调用应调用的函数_.myUDF() application._通过引用 而不是为每个组件重新创建文件中的每个函数。

这应该是最快,最轻松的方法,不是吗?如果我更改了对组件include的添加功能,是否有人可以建议对此样式进行增强,或者给出为什么functions.cfc更可取的理由,而不需要重新创建组件?

3 个答案:

答案 0 :(得分:4)

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

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

<cfset functions.functionA()>

因此,有很多代码需要重构。

似乎您应该使用extend functions.cfc来使用现有的CFC:

<cfcomponent extends="cfc.functions">

这使您的其他组件成为functions.cfc的其他子组件 子对象 ,因此它们继承了functions.cfc的内容。现在,您可以从任何子CFC中调用functionA(),就像添加functions.cfm一样。

如果这更符合您的要求,并且您希望所有CFC都包含这些功能,则可以完全 baller 进行移动并更新CF服务器的扩展所有CFC的核心component.cfc。该文件应该在<CF_ROOT>\WEB-INF\cftags中找到。过去,我已经为ColdBox应用程序添加了其他“本机”功能。只要确保您跟踪源代码管理中的更改即可。

答案 1 :(得分:2)

如果我理解正确,您已经将所有功能从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();
    }

    ...

}

现在,如果您更改组件中的某些内容,则只需再次运行“初始化例程”。这将更新/覆盖存储在application.o结构中的组件。因此,请将这些行放在一个单独的文件中,以便在应用程序启动时和需要进行实时更新的调用中包含在“重新启动”模板中。

答案 2 :(得分:1)

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

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

“最佳”选择将更多地取决于哪个功能对您的设置更重要。

我也很好奇您为什么将application.functions转移到variables.functions。只要functions.cfm内的方法不写入应用程序范围(应将其锁定在方法的本地级别),您就应该能够在应用程序范围内简单地引用它们。