1

カスタム フレームワークから Coldbox への移行を検討しています。

アプリケーションには 3 つのデータソースがあります

  1. 一般
  2. サイト

Core データソースにはサイトに関する情報が保存され、共通データソースには状態テーブルなどの共有情報が保存され、Site データソースには Web サイトに関連するデータが保存されます。

サイトのデータソースは、リクエストの URL に基づいてリクエストごとに変更されるため、各サイトを独自のデータベースにサンドボックス化できます。

私のテストから、Coldbox によって生成され、その自動配線で使用される DatasourceBeans は、アプリケーション スコープに格納/キャッシュされているようです。これは私が考えていることですが、データソースへの変更はリクエスト間で保持されます。

Coldbox.cfc 内

datasources = {
    Core   = {name="DSNCore", dbType="mssql", username="", password=""},
    Common   = {name="DSNCommon", dbType="mssql", username="", password=""},
    Site = {name="", dbType="mssql", username="", password=""}
};

interceptors = [{
    class="interceptors.Website",
    properties={}
}];

Website.cfc という名前のインターセプター

<cfcomponent name="Website" output="false" autowire="true">

    <cfproperty name="dsncore" inject="coldbox:datasource:Core">
    <cfproperty name="dsn" inject="coldbox:datasource:Site">

    <cffunction name="Configure" access="public" returntype="void" output="false" >
    </cffunction>

    <cffunction name="preProcess" access="public" returntype="void" output="false" >
        <cfargument name="event" required="true" type="coldbox.system.web.context.RequestContext">
        <cfargument name="interceptData" required="true" type="struct">
        <cfset var q="" />

        <cfdump var="#dsn.getMemento()#" label="DSN before change" />
        <cfquery name="q" datasource="#dsncore.getName()#">
            SELECT
                Datasource
            FROM
                Websites
            WHERE
                Domain = <cfqueryparam cfsqltype="cf_sql_idstamp" value="#cgi.http_host#" />
        </cfquery>
        <cfscript>
        dsn.setName(q.Datasource);
        </cfscript>
        <cfdump var="#dsn.getMemento()#" label="DSN after change" />
        <cfdump var="#q#" label="Results of query" /><cfabort />

    </cffunction>
</cfcomponent>

Coldbox autowire データソース Bean を使用できる方法でこれを行う方法はありますか?

正直なところ、これは私がやろうと思っていた方法です。リクエストごとにハードコードされていない異なるデータソースをモデルに使用させる方法について他のアイデアがあれば、フレームワークをよりよく理解したいと思います。

この問題は ORM にも当てはまります。たとえば、Transfer がリクエストごとに異なるデータソースを使用する方法はありますか? データベースが異なるスキーマを持つ可能性がある場合はどうなるでしょうか? あるデータベースが新しいバージョンに更新されたが、別のデータベースはまだ古いバージョンを使用していて、基本的に、更新されたデータベースに拡張機能を提供するためにコードにいくつかの if ステートメントがあるとします。

これらの質問を読んで、「そんなことをするべきではない」と考えているかもしれません。私はそうですので、やらないと言って答えないでください。単一のコードベースを異なるデータベースに接続するためのより良い方法についてのアイデアがあれば、私はすべて耳にします。

4

1 に答える 1