2010-11-07 68 views
3

我有一個使用上下文相關數據源的應用程序。目前,我一直保存在這樣數據源中使用數據源的最佳做法

reqeust.DB.Datasource = "DatasourceName"; 
request.DB.Username = "DatasourceUsername" 
request.DB.Password = "DatasourcePassword" 

我然後覆蓋取決於上下文中的變量數據源的信息,所以每個CFQUERY標籤具有的屬性數據源=「#request.DB.Datesource#」 ......等。

我想開始轉向像Coldbox這樣的更多CFC中心框架,但我不明白這是如何工作的。

我是否需要將數據源對象傳入CFC的init語句中?這似乎是一個超級PITA。

回答

3

使用CF9,你可以在Application.cfc中使用this.datasource作爲默認的數據源。不幸的是,它似乎並沒有有一種方法來設置用戶名/密碼

要麼

A.)使用依賴注入框架如ColdSpring(僅適用於單服務),光纜或冷箱本身的DI解決方案(Wirebox)。並通過init構造函數或setters注入數據源/用戶名/密碼。

B.)在Coldbox.xml.cfm設置<Datasources>,請參閱:http://wiki.coldbox.org/wiki/ConfigurationFile.cfm

<!--Datasource Setup, you can then retreive a datasourceBean 
    via the getDatasource("name") method: --> 
<Datasources> 
    <Datasource alias="MyDSNAlias" 
        name="real_dsn_name" 
        dbtype="mysql" 
        username="" 
        password="" /> 
</Datasources> 
+0

那麼,是什麼cfquery標籤的樣子,從兩個中的CFC ption? – 2010-11-07 18:20:31

+0

噢,這裏的想法是應用根據登錄的用戶訪問不同的數據源,所以我需要能夠根據查詢結果或會話變量動態設置數據源。在任何給定請求中使用兩個數據源,一個是認證數據源,另一個是基於認證結果設置的。 – 2010-11-07 18:26:13

+0

你的服務層應該處理邏輯,並且可能調用你的DAO層,通過參數範圍傳入的數據源變量?將您的2個數據源緩存在服務層的變量作用域中,由您的Dependancy Injection框架注入? – Henry 2010-11-08 02:28:45

0

即使你的對象只有在請求級別得到初始化,現在看來似乎應該是更小的痛苦以這種方式一起工作的。

<cfscript> 
request.DB.Datasource = "DatasourceName"; 
request.DB.Username = "DatasourceUsername"; 
request.DB.Password = "DatasourcePassword"; 

request.randomDAO = createObject('component','DAOStuff.randomDAO'); 
request.randomDAO.init(DBObject = request.DB); 

request.someQuery = request.randomDAO.someGetter(); 
request.someOtherQuery = request.randomDAO.someOtherGetter(); 
request.aThirdQuery = request.randomDAO.aThirdGetter(); 
</cfscript> 

至於反對:

<cfscript> 
request.DB.Datasource = "DatasourceName"; 
request.DB.Username = "DatasourceUsername"; 
request.DB.Password = "DatasourcePassword"; 
</cfscript> 

<cfquery name="request.someQuery" 
    datasource=request.DB.Datasource 
    username=request.DB.Username 
    password=request.DB.Password> 
    --SOME SQL HERE 
</cfquery> 

<cfquery name="request.someOtherQuery" 
    datasource=request.DB.Datasource 
    username=request.DB.Username 
    password=request.DB.Password> 
    --SOME SQL HERE 
</cfquery> 

<cfquery name="request.aThirdQuery" 
    datasource=request.DB.Datasource 
    username=request.DB.Username 
    password=request.DB.Password> 
    --SOME SQL HERE 
</cfquery> 

如果它是安全的,在應用級(這裏假設爲對象的數據源不會在運行時更改爲存在於您的數據對象和您編寫線程安全的氟氯化碳)你可以存儲和初始化應用程序級別的DAO,然後每個請求具有非常簡單的代碼,如:

<cfscript> 
request.someQuery = application.randomDAO.someGetter(); 
request.someOtherQuery = application.randomDAO.someOtherGetter(); 
request.aThirdQuery = application.randomDAO.aThirdGetter(); 
</cfscript> 
相關問題