我对此的建议是创建一个基类,然后让需要数据库访问的组件扩展该组件。它不必在直接的父层次结构中,而是在某个地方。
他们的目标是做两件事,将 cfc 从主程序中抽象出来,并使其易于配置。这实现了两者。
因此,查询数据库的 CFC 将如下所示:
<cfcomponent extends="DataAccessBase">
<cffunction name="myFunction" access="public" returntype="string">
<cfquery datasource="#getDSN()#" name="qStuff">select * from table</cfquery>
</cffunction>
上面的关键是extends="DataAccessBase"
部分。这增加了一个抽象层,您可以在其中控制一个可配置点的数据访问,但它并不依赖于应用程序本身,而是将组件从其实现的地方抽象出来。
你DataAccessBase.cfc
可能看起来像这样:
<cfcomponent>
<cffunction name="loadSettings">
<cfparam name="request.settings" default="#structNew()#">
<cfparam name="request.settigns.loaded" default="false">
<cfif request.settings.loaded eq false>
<!--- load settings from resource bundle etc --->
<cfset request.settings.dsn = 'myDSN'>
<cfset request.settings.loaded = true>
</cfif>
</cffunction>
<cffunction name="getDsn" access="public" returntype="string">
<cfset loadSettings()>
<cfreturn request.settings.dsn>
</cffunction>
您当然可以更复杂地配置和存储设置等,但这超出了我认为的问题范围。:)
我看不出有任何理由在每个方法调用中都传递 DSN。是的,它有效,但没有必要。这些组件是根据数据结构的内置假设开发的,因此您知道它不会从 addItem() 调用更改为 updateItem() 调用,因此它的重复工作意味着额外的故障点。:P
说得通?