我出于简化目的的申请
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
更可取的理由,而不需要重新创建组件?
答案 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.cfc
和categories.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
内的方法不写入应用程序范围(应将其锁定在方法的本地级别),您就应该能够在应用程序范围内简单地引用它们。