【问题标题】:Best practice for Datasource use in a CFC在 CFC 中使用数据源的最佳实践
【发布时间】:2012-11-30 06:07:19
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: coldfusion datasource cfc coldbox


    【解决方案1】:

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

    要么

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

    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>
    

    【讨论】:

    • 那么任何一个选项的 cfc 中的 CFQuery 标签是什么样子的?
    • 哦,这里的想法是应用程序根据登录者访问不同的数据源,因此我需要能够根据查询结果或会话变量动态设置数据源。任何给定请求都会使用两个数据源,一个是身份验证数据源,另一个是根据身份验证的结果设置的。
    • 您的服务层应该处理逻辑,并且可能使用通过参数范围传入的数据源变量调用您的 DAO 层?将您的 2 个数据源缓存在服务层的变量范围中,由您的依赖注入框架注入?
    • 只是一个脚注,从 CF9.0.1 开始,您现在可以在使用结构设置应用程序范围的数据源时指定用户名和密码。
    【解决方案2】:

    即使您的对象仅在请求级别进行初始化,以这种方式使用似乎也不那么痛苦。

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

    【讨论】:

      猜你喜欢
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      • 2021-10-29
      • 1970-01-01
      • 2021-08-22
      • 1970-01-01
      相关资源
      最近更新 更多