Мое предложение для этого - создать базовый класс, а затем сделать так, чтобы ваши компоненты, которым требуется доступ к базе данных, расширили этот компонент.Это не обязательно должно быть в непосредственной родительской иерархии, но где-то внизу.
Их цель состоит в том, чтобы сделать две вещи, сохранить абстрагирование 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
Имеет смысл?