代码之家  ›  专栏  ›  技术社区  ›  cherdt

跨应用程序重新使用ColdFusion ORM实体/对象?

  •  3
  • cherdt  · 技术社区  · 13 年前

    是否可以跨应用程序重用ColdFusion ORM对象?

    例如,我在一个名为app1的文件夹中设置了一个启用ORM的应用程序app1。我创建了一个department.cfc,它对应于一个部门数据库表:

    <cfcomponent>
    <cfset this.name = "app1"> 
    <cfset this.ormenabled = "true">
    <cfset this.ormSettings = {
        datasource = "myDS",
        schema = "mySchema",
        dialect = "Oracle10g",
        logSQL = "false"
    }>
    

    我可以从CFM文件加载和转储内容:

    <cfset item = EntityLoad("department")>
    <cfdump var="#item#">
    

    然后,我在一个名为app2的文件夹中设置了一个相同的启用ORM的应用程序app2。我在那里创建了一个department.cfc,扩展了app1中的department.c:

    <cfcomponent persistent="true" extends="my.path.app1.department">
    </cfcomponent>
    

    当我尝试加载和转储内容时,会出现一个错误:

    系统试图使用未定义的值,这通常表示您的代码或某些系统代码中存在编程错误。 空指针是未定义值的另一个名称。

    我已验证路径是否正确。例如,我能够使用CreateObject实例化对象:

    <cfset item = CreateObject("component","my.path.app1.department")>
    <cfdump var = "#item#">
    

    我希望我可以引用一个CFC并重用该对象,但除非我遗漏了一些内容,否则可能有必要在app2中重新创建该对象。

    2 回复  |  直到 13 年前
        1
  •  1
  •   AlexP    13 年前

    CFC(实体)可以在两个不同的应用程序中实例化,每个应用程序都使用自己的ORM。您所需要做的就是将它们放置在服务器上的这个中心位置,也许可以创建一个特定于应用程序的/全局文件映射,然后您就可以创建新的实例。然而,最方便的方法是通过应用程序中的“this.ormSettings”变量。fc,因为您可以在一个地方完成所有操作。

    例如:

        component displayname="Application"
        {
            this.ormSettings = {
                cfclocation = [
                    "/full/path/to/cfc/directory", 
                    "Entity",
                    "/a/relative/path" 
                ]
            };
    
            this.mappings["/Entity"] = "full/dir/path/to/another/cfc/directory/called/whatever";
    
        }
    

    这些位置中的每一个都将在任何其他目录之前搜索匹配的CFC,因此通过明确定义它们也有潜在的性能优势。

        2
  •  0
  •   CfSimplicity    13 年前

    正如AlexP所说,您当然可以让多个应用程序使用相同的“模型”或一组ORM实体CFCs,通过映射来访问它们。

    但是继承在ORM中的作用有点不同。一种持久性氟氯化碳不能扩展另一种持久型氟氯化碳(至少在CF9中没有)。相反,母CFC必须标记为“ mapped超类 “并且persistent属性设置为false或已删除。然后子持久CFC应该能够扩展它:

    <cfcomponent name="Pet" mappedSuperClass="true" persistent="false">
    ...
    </cfcomponent>
    
    <cfcomponent name="Cat" extends="Pet" persistent="true" table="cats">
    ...
    </cfcomponent>
    

    这显然限制了您在ORM中使用继承所能做的事情。你不能单独使用宠物作为实体,但它对于共享猫、狗和兔子实体中可能重复的属性很有用。