カスタム フレームワークから Coldbox への移行を検討しています。
アプリケーションには 3 つのデータソースがあります
- 芯
- 一般
- サイト
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 ステートメントがあるとします。
これらの質問を読んで、「そんなことをするべきではない」と考えているかもしれません。私はそうですので、やらないと言って答えないでください。単一のコードベースを異なるデータベースに接続するためのより良い方法についてのアイデアがあれば、私はすべて耳にします。