首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当用于DataSource和数据库模式时,如何避免在CFCs中使用会话变量?

问当用于DataSource和数据库模式时,如何避免在CFCs中使用会话变量?
EN

Stack Overflow用户
提问于 2011-07-13 15:42:31
回答 5查看 1.5K关注 0票数 1

我试图重构我所有的CFCs,以避免使用会话和应用程序变量(这不是一项容易的任务)。

但是,在此应用程序中,每个数据库调用都使用会话变量,因为不同的登录用户可能正在访问不同的数据库和模式:

代码语言:javascript
复制
<cfquery name="qEmployees" datasource="#SESSION.DataSourceName#">
    SELECT *
    FROM #SESSION.DatabaseSchema#.Employees
</cfquery>

我不想经历将这两个会话变量传递给每个访问数据库的方法调用的麻烦。尤其是这种情况,因为我不想在远程AJAX调用中传递DSNs和Schema名称。

这样做的最佳实践是什么?对于所有不应该在氟氯化碳中使用的Scopes?

EN

回答 5

Stack Overflow用户

发布于 2011-07-13 16:02:36

我认为,由于数据源确实是变量,所以我会将其作为可选参数传递到每个函数中,并将默认值设置为变量范围内的dsn属性。我会在CFC的构造函数中设置范围为DSN的变量。这样,您只需为AJAX调用传入DSN即可。

代码语言:javascript
复制
<cffunction name="doFoo" access="remote"...>
    <cfargument name="dsn" type="String" required="false" default="#variables.datasource#" />
</cffunction>

我会使用应用程序的会话范围来存储用户dsn名称,并使用这个var传递给AJAX调用。

票数 2
EN

Stack Overflow用户

发布于 2011-07-13 16:24:44

您应该创建一个"init“方法,作为CFC的构造函数。然后,您可以实例化这些CFCs并将它们存储在一个共享作用域中,很可能是应用程序作用域。从这里开始,要通过AJAX使用这个CFC,我通常会创建一个远程外观。基本上,这是另一个将直接访问应用程序范围中的CFC实例的CFC。它将实现您需要通过Ajax访问的方法,使用access="remote"公开它们,从而使您的应用程序能够从实际的CFC访问access="public"方法。在这种情况下,通常认为远程外观可以作为设计模式的一部分直接访问应用程序范围。

一个简单的例子:

example.cfc:

代码语言:javascript
复制
<cfcomponent output="false">
    <cffunction name="init" access="public" output="false" returntype="any">
        <cfargument name="dsn" type="string" required="true" />
        <cfset variables.dsn = arguments.dsn />
        <cfreturn this />
    </cffunction>
    <cffunction name="doStuff" access="public" output="false" returntype="query">
        <cfset var q = "" />
        <cfquery name="q" datasource="#variables.dsn#">
        select stuff from tblStuff
        </cfquery>
        <cfreturn q />
    </cffunction>
</cfcomponent>

在Application.cfc onApplicationStart()方法中:

代码语言:javascript
复制
<cfset application.example = createObject("component","example").init(dsn = "somedsn") />

remote.cfc:

代码语言:javascript
复制
<cfcomponent output="false">
    <cffunction name="doStuff" access="remote" returntype="query">
        <cfreturn application.example.doStuff() />
    </cffunction>
</cfcomponent>
票数 2
EN

Stack Overflow用户

发布于 2011-07-13 16:00:40

可以在onRequest或onRequestStart函数中设置数据源变量吗?

代码语言:javascript
复制
<cffunction name="onSessionStart">
    <cfset session.dsn = _users_personal_dsn_ />
</cffunction>


<cffunction name="onRequestStart" >
   <cfset dsn = "#session.dsn#" />
</cffunction>

<cfquery name="qEmployees" datasource="#dsn#">
    SELECT *
    FROM #SESSION.DatabaseSchema#.Employees
</cfquery>

等。

不确定这是否有效-实际上觉得-sean有点草率。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6681632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档