允许不同的ColdFusion CFC相互实例的正确方法是什么?

Dav*_*e L 10 coldfusion cfc

关于在特定项目中需要相互交谈的CFC实例的正确方法,我有一个"最佳实践"问题.

比方说,您有一个Web应用程序,其中包含许多不同的模块:

  • 在线日历
  • 网上商城
  • 博客
  • 文件管理器(上传/下载/处理文件)
  • 用户帐户

这些模块中的每一个都组织得很好,以便与每个模块相关的功能包含在单独的CFC文件中:

  • Calendar.cfc
  • Store.cfc
  • Blog.cfc
  • Files.cfc
  • Users.cfc

每个CFC都包含适用于该特定模块的功能.例如,Users.cfc包含与开启/关闭用户,更新帐户信息等有关的功能......有时,CFC可能需要引用另一个CFC中的功能,例如,如果商店(Store.cfc)需要获取信息来自客户(Users.cfc).但是,我不确定实现这一目标的正确方法.我一直在玩几种方式让我的CFC互相引用:

方法1:在CFC中,例如您将需要的其他CFC:

<!--- Store.cfc --->
<cfcomponent>

<!--- instance all the CFC’s we will need here --->
<cfset usersCFC = CreateObject("component","users") />
<cfset filesCFC = CreateObject("component","files") />

<cffunction name="storeAction">

     <cfset var customerInfo = usersCFC.getUser(1) />
Run Code Online (Sandbox Code Playgroud)

这种方法似乎大部分时间都有效,除非一些实例化的CFC也实例化了它们的CFC.例如:如果Users.cfc实例Files.cfc和Files.cfc也是Users.cfc实例.由于某种类型的无限递归问题,我偶尔会遇到可怕的NULL NULL错误.

方法2:在CFC的函数范围内实例化所需的CFC(这似乎可以防止递归问题):

<!--- Store.cfc --->
<cfcomponent>

     <cffunction name="storeAction">

          <!--- create a struct to keep all this function’s variables --->
           <cfset var local = structNew() />

          <!--- instance all the CFC’s we will need here --->
           <cfset local.usersCFC = CreateObject("component","users") />
           <cfset local.filesCFC = CreateObject("component","files") />

          <cfset var customerInfo = local.usersCFC.getUser(1) />
Run Code Online (Sandbox Code Playgroud)

我对这种方法的关注是它在内存和处理效率方面可能效率不高,因为你最终需要为每个需要它的函数多次实例化相同的CFC.然而,它确实通过将CFC隔离到它们各自的函数范围来解决无限递归的方法1的问题.

基于我在网上看到的东西和面向对象编程的文章,我想到的一件事是利用"Base.cfc",它使用cfcompontent标签的"extends"属性来实例化应用程序中的所有CFC. .但是,我以前从未测试过这种类型的设置,我不确定这是否是允许我所有CFC相互通信的理想方式,特别是因为我相信使用扩展覆盖功能,如果它们中的任何一个共享一个共同的功能名称(例如"init()").

<!--- Base.cfc --->
<cfcomponent extends="calendar store blog users files">
Run Code Online (Sandbox Code Playgroud)

解决此类问题的正确"最佳实践"方法是什么?

Joh*_*ish 16

如果你的每个CFC实例都是单例(即你的应用程序中只需要它的一个实例),那么你肯定想要研究Dependancy Injection.CF有三种主要的Dependancy Injection框架; ColdSpring,WireBox和DI/1.

我建议您查看DI/1或WireBox,因为ColdSpring暂时没有更新.

DI/1的维基页面在这里:https: //github.com/framework-one/di1/wiki/Getting-Started-with-Inject-One

Wirebox维基页面在这里:http://wiki.coldbox.org/wiki/WireBox.cfm

基本上这些框架的作用是创建(实例化)您的CFC(bean),然后处理它们彼此之间的依赖关系.因此,当您需要获取实例化的CFC时,它已经连接好并准备好了.

Dependancy Injection有时也称为IoC(控制反转),是许多语言中常用的设计模式.

希望有所帮助,祝你好运!