有没有办法(每个请求)在Coldbox中设置非持久性数据库Bean

时间:2011-12-21 17:03:20

标签: coldfusion coldbox

我希望从自定义框架迁移到Coldbox。

该应用程序有3个数据源

  1. 核心
  2. 通用
  3. 网站
  4. 核心数据源存储有关站点的信息,公共数据源存储共享信息(如状态表),站点数据源存储与网站相关的数据。

    根据请求的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={}
    }];
    

    Interceptor名为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。有没有办法让转移为每个请求使用不同的数据源?如果数据库可能具有可能不同的模式,该怎么办?可以说一个数据库已经更新到更新的版本,但是另一个仍然使用旧版本,我在代码中基本上有一些if语句,以便为更新的数据库提供增强的功能。

    你可能正在阅读这些问题并自己思考“你不应该这样做。”我是,所以请不要回答说不要这样做。如果您有关于将单个代码库附加到不同数据库的更好方法的想法,那么我会全力以赴。

1 个答案:

答案 0 :(得分:1)

另一种方法是使用Coldbox.cfc中的requestStartHandler

<!---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>

然后,您只需将您的dataSource存储在Request Collection中,因为onRequestStart将在每个请求中触发。