将应用程序的用户定义函数包含到模块中
Including Application's user-defined-functions into modules
我出于简化目的的申请有
- 申请
- 包括
functions.cfm
- 缓存对象
application.o
cfcomponent
个模块,每个模块都有 create/update/view 个模型类型
- 每个组件都包含
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
?
则不需要重新创建组件
使用 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.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();
}
...
}
现在,如果您更改组件中的某些内容,您只需再次 运行 "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" 功能。只需确保在源代码管理中跟踪这些更改即可。
我出于简化目的的申请有
- 申请
- 包括
functions.cfm
- 缓存对象
application.o
cfcomponent
个模块,每个模块都有 create/update/view 个模型类型- 每个组件都包含
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
?
使用 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.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();
}
...
}
现在,如果您更改组件中的某些内容,您只需再次 运行 "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" 功能。只需确保在源代码管理中跟踪这些更改即可。