2012-09-25 27 views
3

是否可以在應用程序間重用ColdFusion ORM對象?跨應用程序重複使用ColdFusion ORM實體/對象?

例如,我在名爲app1的文件夾中設置了一個名爲app1的已啓用ORM的應用程序。我創建了對應於一個部門的數據庫表中的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的文件夾中,名爲app2的啓用ORM的應用程序。我創建了一個department.cfc有一個擴展department.cfc在APP1:

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

當我嘗試裝載和卸載的內容,我得到一個錯誤:

系統試圖使用一個未定義的值,通常表示編程錯誤,無論是在您的代碼或一些系統代碼。 空指針是未定義值的另一個名稱。

我已驗證路徑是否正確。例如。我能夠使用CreateObject來實例化對象:

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

我希望我可以指單個CFC和重複使用對象,但除非我失去了一些東西,它看起來像它可能是必要的在app2中重新創建對象。

+0

你想獲取相同的實例或只是實例化相同的CFC?無論哪種情況,您都不能在ORM視角的單獨應用程序內重複使用同一個實體,而無需在兩個應用程序中定義實體的元數據。你可以有一個庫來實現這一點,並在使用相同的數據源/實體映射時擴展application.cfc等。 – AlexP

+0

我試圖實例化相同的CFC,因爲我認爲使用相同代碼的多個CFC會是多餘的。我喜歡你的ORM庫應用程序的想法 - 我會試一試。 – cherdt

回答

1

CFC(實體)可以在兩個不同的應用程序中實例化,它們各自使用自己的ORM。所有你需要做的就是把它們放在服務器的這個中心位置,也許創建一個特定於應用的/全局文件映射,然後你可以創建新的實例。然而,最方便的方法是通過application.cfc中的「this.ormSettings」變量,因爲您可以在一個位置完成所有操作。

例如:

component displayname="Application" 
    { 
     this.ormSettings = { 
      cfclocation = [ 
       "/full/path/to/cfc/directory", 
       "Entity", 
       "https://stackoverflow.com/a/relative/path" 
      ] 
     }; 

     this.mappings["/Entity"] = "full/dir/path/to/another/cfc/directory/called/whatever"; 

    } 

每個地點都會將搜索之前的任何其他目錄匹配的CFC,所以也通過明確界定他們潛在的性能優勢。

+0

謝謝亞歷克斯 - 這正是我一直在尋找的! – cherdt

0

你可以肯定有多個應用程序使用相同的「模型」,或一組OR​​M實體CFC,通過映射可以訪問它們,如AlexP所說。

但是,ORM中的繼承工作有點不同。持久性CFC不能擴展另一個持久性CFC(至少不在CF9中)。相反,父CFC必須標記爲「映射超類」,並將持久屬性設置爲false或刪除。孩子持續的CFC應該能夠擴展它:

<cfcomponent name="Pet" mappedSuperClass="true" persistent="false"> 
... 
</cfcomponent> 

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

這顯然限制了你可以用ORM中的繼承做些什麼。您不能將Pet作爲實體使用,但它對於共享您的Cat,Dog和Rabbit實體中會重複的屬性非常有用。