3

アプリケーション間でColdFusionORMオブジェクトを再利用することは可能ですか?

たとえば、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対応アプリケーションをセットアップしました。app1のdepartment.cfcを拡張するdepartment.cfcをそこに作成しました。

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

コンテンツをロードしてダンプしようとすると、エラーが発生します。

システムが未定義の値を使用しようとしました。これは通常、コードまたはシステムコードのいずれかでプログラミングエラーを示しています。ヌルポインタは、未定義の値の別名です。

パスが正しいことを確認しました。たとえば、CreateObjectを使用してオブジェクトをインスタンス化できました。

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

単一のCFCを参照してオブジェクトを再利用できることを望んでいますが、何かが足りない場合を除いて、app2でオブジェクトを再作成する必要があるようです。

4

2 に答える 2

1

CFC(エンティティ)は、それぞれが独自のORMを使用する2つの異なるアプリケーション内でインスタンス化できます。あなたがする必要があるのは、それらをサーバー上のこの中央の場所に配置し、おそらくアプリケーション固有/グローバルファイルマッピングを作成することです。そうすれば、新しいインスタンスを作成できます。ただし、最も便利な方法は、application.cfc内の「this.ormSettings」変数を使用することです。これは、すべてを1か所で実行できるためです。

例えば:

    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が検索されるため、明示的に定義することでパフォーマンスが向上する可能性もあります。

于 2012-09-25T17:32:45.680 に答える
0

AlexPが言うように、マッピングを介してアクセスできるようにすることで、複数のアプリケーションに同じ「モデル」またはORMエンティティCFCのセットを使用させることができます。

ただし、ORMでは継承の動作が少し異なります。永続CFCは、別の永続CFCを拡張できません(少なくともCF9では拡張できません)。代わりに、親CFCを「mappedsuperclass」としてマークし、永続属性を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エンティティで複製されるプロパティを共有する場合に役立ちます。

于 2012-09-25T20:35:53.670 に答える