gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:11:23 24 4
gpt4 key购买 nike

关于在给定项目中都需要相互交谈的 CFC 实例的正确方法,我有一个“最佳实践”问题。

例如,假设您有一个 Web 应用程序,其中包含许多不同的模块:

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

  • 这些模块中的每一个都组织得很好,因此与每个模块相关的功能都包含在单独的 CFC 文件中:
  • 日历.cfc
  • Store.cfc
  • 博客.cfc
  • 文件.cfc
  • 用户.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) />

    这种方法似乎在大多数情况下都有效,除非某些实例化的 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) />

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

    根据我在网上看到的内容和有关面向对象编程的文章,我想到的一件事是利用“Base.cfc”,它使用 cfcompontent 标记的“extends”属性来实例化应用程序中的所有 CFC .但是,我以前从未测试过这种类型的设置,我不确定这是否是让我的所有 CFC 相互通信的理想方式,特别是因为我相信如果它们中的任何一个共享一个公共(public)函数,则使用扩展会覆盖函数名称(例如“init()”)。
    <!--- Base.cfc --->
    <cfcomponent extends="calendar store blog users files">

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

    最佳答案

    如果您的每个 CFC 实例都打算成为单例(即您的应用程序中只需要它的一个实例),那么您肯定想要研究依赖注入(inject)。 CF 有三个主要的依赖注入(inject)框架; ColdSpring、WireBox 和 DI/1。

    我建议您查看 DI/1 或 WireBox,因为 ColdSpring 已经有一段时间没有更新了。

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

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

    本质上,这些框架所做的是创建(实例化)您的 CFC(bean),然后处理它们彼此之间的依赖关系。因此,当您需要获得实例化的 CFC 时,它已经连接好并准备就绪。

    依赖注入(inject)有时也称为 IoC(控制反转),是许多语言中使用的常见设计模式。

    希望有帮助,祝你好运!

    关于coldfusion - 允许不同的 ColdFusion CFC 相互实例化的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26805899/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com