我试图重构我所有的CFCs,以避免使用会话和应用程序变量(这不是一项容易的任务)。
但是,在此应用程序中,每个数据库调用都使用会话变量,因为不同的登录用户可能正在访问不同的数据库和模式:
<cfquery name="qEmployees" datasource="#SESSION.DataSourceName#">
SELECT *
FROM #SESSION.DatabaseSchema#.Employees
</cfquery>我不想经历将这两个会话变量传递给每个访问数据库的方法调用的麻烦。尤其是这种情况,因为我不想在远程AJAX调用中传递DSNs和Schema名称。
这样做的最佳实践是什么?对于所有不应该在氟氯化碳中使用的Scopes?
发布于 2011-07-13 16:02:36
我认为,由于数据源确实是变量,所以我会将其作为可选参数传递到每个函数中,并将默认值设置为变量范围内的dsn属性。我会在CFC的构造函数中设置范围为DSN的变量。这样,您只需为AJAX调用传入DSN即可。
<cffunction name="doFoo" access="remote"...>
<cfargument name="dsn" type="String" required="false" default="#variables.datasource#" />
</cffunction>我会使用应用程序的会话范围来存储用户dsn名称,并使用这个var传递给AJAX调用。
发布于 2011-07-13 16:24:44
您应该创建一个"init“方法,作为CFC的构造函数。然后,您可以实例化这些CFCs并将它们存储在一个共享作用域中,很可能是应用程序作用域。从这里开始,要通过AJAX使用这个CFC,我通常会创建一个远程外观。基本上,这是另一个将直接访问应用程序范围中的CFC实例的CFC。它将实现您需要通过Ajax访问的方法,使用access="remote"公开它们,从而使您的应用程序能够从实际的CFC访问access="public"方法。在这种情况下,通常认为远程外观可以作为设计模式的一部分直接访问应用程序范围。
一个简单的例子:
example.cfc:
<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()方法中:
<cfset application.example = createObject("component","example").init(dsn = "somedsn") />remote.cfc:
<cfcomponent output="false">
<cffunction name="doStuff" access="remote" returntype="query">
<cfreturn application.example.doStuff() />
</cffunction>
</cfcomponent>发布于 2011-07-13 16:00:40
可以在onRequest或onRequestStart函数中设置数据源变量吗?
<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有点草率。
https://stackoverflow.com/questions/6681632
复制相似问题