数据源在CFC中使用的最佳实践

时间:2010-11-07 06:14:45

标签: coldfusion datasource cfc coldbox

我有一个使用上下文敏感数据源的应用程序。目前我保存了数据源信息

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

然后我根据上下文覆盖变量,因此每个cfquery标签都有datasource =“#request.DB.Datesource#”......等等......

我想开始转向更多以CFC为中心的框架,比如Coldbox,但我不知道这是如何运作的。

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

2 个答案:

答案 0 :(得分:3)

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

无论

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

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>

答案 1 :(得分: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>