Есть ли способ (по запросу) установить непостоянный компонент базы данных в Coldbox - PullRequest
1 голос
/ 21 декабря 2011

Я хочу перейти с пользовательского фреймворка на Coldbox.

Приложение имеет 3 источника данных

  1. Основной
  2. Common
  3. Сайт

Основной источник данных хранит информацию о сайтах, общий источник данных хранит общую информацию, такую ​​как таблица состояний, а источник данных сайта хранит данные, относящиеся к сайту.

Источник данных сайта изменяется для каждого запроса на основе 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 в коде для обеспечения расширенной функциональности обновленной базы данных.

Возможно, вы читаете эти вопросы и думаете себе: «Ты не должен этого делать». Ну, я, так что, пожалуйста, никаких ответов, говоря не делать этого. Если у вас есть идеи о лучших способах присоединения единой кодовой базы к разным базам данных, тогда я все уши.

1 Ответ

1 голос
/ 21 декабря 2011

Другой способ сделать это - использовать requestStartHandler в Coldbox.cfc

<!---config/Coldbox.cfc--->
requestStartHandler = "Main.onRequestStart"

<!---handlers/Main.cfc--->
<cffunction name="onRequestStart" returntype="void" output="false">
    <cfargument name="event" required="true">
    <cfquery name="q" datasource="#dsncore.getName()#">
        SELECT
            Datasource
        FROM
            Websites
        WHERE
            Domain = <cfqueryparam cfsqltype="cf_sql_idstamp" value="#cgi.http_host#" />
    </cfquery>

    <cfset rc.dataSource = q.Datasource />
</cffunction>

Тогда ваш источник данных будет храниться в коллекции запросов, потому что onRequestStart будет запускаться при каждом запросе.

...