2011-12-21 18 views
1

我期待從自定義框架遷移到Coldbox。有沒有辦法(每個請求)在Coldbox中設置非持久數據庫Bean

的應用有3個數據源

  1. 核心
  2. 常見
  3. 網站

核心數據源存儲有關網站的信息,通用數據源存儲共享信息,如狀態表,並且網站數據源存儲與網站相關的數據。

根據請求的URL,Site datasource根據請求更改,允許將每個站點都安裝到自己的數據庫中。

從我的測試看來,由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語句在代碼中爲更新的數據庫提供增強的功能。

你可能會閱讀這些問題和思考自己:「你不應該這樣做。」那麼我是,所以請不要回答說不要這樣做。如果您有更好的方法讓單個代碼庫連接到不同數據庫的想法,那麼我儘管耳熟能詳。

回答

1

你可以做的另一種方式是通過在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您的數據源使用requestStartHandler將觸發在每次請求。

+0

這可能會工作,但它似乎並不十分coldboxy。當然,它確實做了一件事,它使得我不必擔心在每個型號cfc中都使用DSL。雖然這也意味着它打破封裝,或者正在使用DSL已經這樣做? – 2011-12-21 17:26:13

+0

我說,去與任何工作... :) – jcreamer898 2011-12-21 17:27:59

+0

這是否意味着每一個功能都需要我做的rc = event.getCollection()? – 2011-12-21 18:52:50

相關問題