Я хочу перейти с пользовательского фреймворка на Coldbox.
Приложение имеет 3 источника данных
- Основной
- Common
- Сайт
Основной источник данных хранит информацию о сайтах, общий источник данных хранит общую информацию, такую как таблица состояний, а источник данных сайта хранит данные, относящиеся к сайту.
Источник данных сайта изменяется для каждого запроса на основе URL-адреса запроса, что позволяет каждому сайту быть помещенным в «песочницу» в свою собственную базу данных.
Из моего тестирования кажется, что DatasourceBeans, сгенерированные Coldbox и использованные в его автопроводке, хранятся / кэшируются в области приложения. Это то, что я думаю сделать, но изменение источника данных сохраняется в запросах.
In 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>
Есть ли способ сделать это так, чтобы я мог использовать bean-компоненты источника данных Coldbox autowire?
Честно говоря, именно так я и думал, что я сделаю это, если у кого-нибудь есть какие-либо идеи о том, как заставить мою модель использовать не-жестко закодированный другой источник данных для запроса, я бы хотел лучше понять структуру.
Этот вопрос также распространяется на ОРМ. Можно ли, скажем, в Transfer использовать другой источник данных для каждого запроса? Что если базы данных могут иметь потенциально разные схемы? Допустим, одна база данных была обновлена до более новой версии, но другая по-прежнему использует более старую версию, и у меня, по сути, есть некоторые операторы if в коде для обеспечения расширенной функциональности обновленной базы данных.
Возможно, вы читаете эти вопросы и думаете себе: «Ты не должен этого делать». Ну, я, так что, пожалуйста, никаких ответов, говоря не делать этого. Если у вас есть идеи о лучших способах присоединения единой кодовой базы к разным базам данных, тогда я все уши.