これに対する私の提案は、基本クラスを作成し、データベースへのアクセスが必要なコンポーネントにそのコンポーネントを拡張させることです。直接の親階層にある必要はありませんが、その下のどこかにあります。
彼らの目標は、cfc をメイン プログラムから抽象化することと、簡単に構成できるようにすることの 2 つを行うことです。これにより、両方が実現します。
したがって、データベースを照会する CFC は次のようになります。
<cfcomponent extends="DataAccessBase">
<cffunction name="myFunction" access="public" returntype="string">
<cfquery datasource="#getDSN()#" name="qStuff">select * from table</cfquery>
</cffunction>
上記のキーはそのextends="DataAccessBase"
部分です。これにより、1 つの構成可能なポイントでデータ アクセスを制御できる抽象化のレイヤーが追加されますが、アプリケーション自体には関連付けられていないため、コンポーネントは実装された場所から抽象化されたままになります。
次の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
わかる?