3

我有一个使用上下文敏感数据源的应用程序。目前我将数据源信息保存在这样的位置

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

然后我根据上下文覆盖变量,因此每个 cfquery 标记都具有属性 datasource="#request.DB.Datesource#" ... 等等 ...

我想开始转向更多以 CFC 为中心的框架,例如 Coldbox,但我只是不明白这将如何工作。

我是否需要将数据源对象传递到 CFC 的 init 语句中?这似乎是一个超级 PITA。

4

2 回答 2

3

使用 CF9,您可以将 Application.cfc 中的 this.datasource 作为默认数据源。不幸的是,它似乎没有办法设置用户名/密码

任何一个

A.) 使用依赖注入框架,例如 ColdSpring(仅适用于单例服务)、Lightwire 或 Coldbox 自己的 DI 解决方案(Wirebox)。init并通过构造函数或设置器注入数据源/用户名/密码。

B.) 设置<Datasources>Coldbox.xml.cfm参见: 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>
于 2010-11-07T07:07:00.560 回答
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>

如果您的数据对象存在于应用程序级别是安全的(假设对象的数据源在运行时不会更改并且您已经编写了线程安全的 CFC)您可以在应用程序级别存储和初始化 DAO然后每个请求都有非常简单的代码,例如:

<cfscript>
request.someQuery = application.randomDAO.someGetter();
request.someOtherQuery = application.randomDAO.someOtherGetter();
request.aThirdQuery = application.randomDAO.aThirdGetter();
</cfscript>
于 2010-11-07T16:25:33.133 回答