【问题标题】:How to reference global function library in CFML?CFML中如何引用全局函数库?
【发布时间】:2024-01-09 23:36:01
【问题描述】:

依赖注入允许您避免直接引用对象外部的对象和范围。您改为引用注入的依赖项。

我想了解全局函数库的最佳实践。我目前将我的功能存储在服务器范围内。我希望我的项目能尽快开源,并让其他开发人员易于理解。我希望应用程序更容易编写单元测试并且更松散耦合。

我应该将服务器范围注入到每个使用全局函数的对象中吗?

或者我应该破例,在引用这些函数时直接将“server.functions.myFunction()”作用域放在组件中?

以下是代码示例:

方法一:

<cfcomponent>
    <cffunction name="init">
        <cfscript>
           server.functions.myFunction();
        </cfscript>
    </cffunction>
</cfcomponent>

方法二:

<cfcomponent>
    <cffunction name="init">
        <cfargument name="serverScope" type="struct" required="yes">
        <cfscript>
            variables.serverScope=arguments.serverScope;
            variables.serverScope.functions.myFunction();
        </cfscript>
    </cffunction>
</cfcomponent>

【问题讨论】:

  • 这个全局库中有多少个函数,你要注入它们的每个组件将使用它们的百分比是多少?我对“全局函数库”之类的东西持谨慎态度,并希望将它们更多地分解为基于目的的组件,并将 那些 注入需要它们的组件中。如果没有看到 lib 中的函数,很难判断,但听起来可能需要在这里进行一些重组?
  • 我能问一下你为什么使用服务器范围而不是应用范围吗?
  • @NotJustClarkKent 我有 100 多个使用相同功能的站点。上传新源代码时,我手动将更新同步到服务器范围。
  • @AdamCameron 示例:电子邮件和其他验证。基于查询的选择元素(和其他 HTML 元素)的生成。自定义 HTML/javascript 界面。文件/目录 i/o、cfhttp 请求发布/验证等。该语言内置的几乎所有内容都包含在自定义版本中,功能更多。就像不是cfinsert,我有自己的动态查询。我知道如果我的一些函数试图保持状态,它们需要成为对象,但有些函数并不意味着是对象。如果这是社区期望看到的,我不介意将它们放入组件中。
  • @NotJustClarkKent 我应该注意到,我的实际框架确实将数据放在应用程序和服务器范围内,具体取决于域或整个服务器的独特性。我将所有这些变量放在另一个键中以防止污染命名空间。例如,Application.zos 和 Server.zos 是一切的地方。

标签: frameworks coldfusion railo cfml code-structure


【解决方案1】:

我从来没有把我的答案正式化。根据您在 cmets 中所说的,我会这样做:

  • 将您的全局库分解为更多特定用途的组件,然后将其视为对象(有状态),或者 - 对于所有意图和目的而言都是静态库(无状态)。
  • 是的,使用依赖注入在特定情况下只注入你需要的

我不会为了方便而破坏封装。

【讨论】: