Лучшая практика использования источников данных в CFC - PullRequest
3 голосов
/ 07 ноября 2010

У меня есть приложение, которое использует контекстно-зависимые источники данных.В настоящее время я храню информацию источника данных в таком виде

reqeust.DB.Datasource = "DatasourceName";
request.DB.Username = "DatasourceUsername"
request.DB.Password = "DatasourcePassword"

. Затем я перезаписываю переменные в зависимости от контекста, поэтому каждый тег cfquery имеет атрибуты datasource = "# request.DB.Datesource #" ... и т. Д....

Я хочу начать переходить на более ориентированные на CFC фреймворки, такие как Coldbox, но я просто не понимаю, как это будет работать.

Нужно ли передавать объект источника данных взаявление инициализации CFC?Кажется, это будет супер PITA.

Ответы [ 2 ]

3 голосов
/ 07 ноября 2010

С CF9 вы можете использовать this.datasource в Application.cfc в качестве источника данных по умолчанию.К сожалению, кажется, что у него нет способа установить имя пользователя / пароль

Либо

A.) Использовать инфраструктуру Dependency Injection, например ColdSpring (подходит только для Singleton Services), Lightwire илиСобственное DI-решение Coldbox (Wirebox).и введите источник данных / имя пользователя / пароль через конструктор или установщики init.

B.) Набор <Datasources> в Coldbox.xml.cfm, см .: http://wiki.coldbox.org/wiki/ConfigurationFile.cfm

<!--Datasource Setup, you can then retreive a datasourceBean
   via the getDatasource("name") method: -->
<Datasources>
  <Datasource alias="MyDSNAlias" 
                  name="real_dsn_name" 
                  dbtype="mysql" 
                  username=""
                  password="" />
</Datasources>
0 голосов
/ 07 ноября 2010

Даже если ваши объекты инициализируются только на уровне запроса, кажется, что работать с таким способом должно быть меньше боли.

<cfscript>
request.DB.Datasource = "DatasourceName";
request.DB.Username = "DatasourceUsername";
request.DB.Password = "DatasourcePassword";

request.randomDAO = createObject('component','DAOStuff.randomDAO');
request.randomDAO.init(DBObject = request.DB);

request.someQuery = request.randomDAO.someGetter();
request.someOtherQuery = request.randomDAO.someOtherGetter();
request.aThirdQuery = request.randomDAO.aThirdGetter();
</cfscript>

В отличие от:

<cfscript>
request.DB.Datasource = "DatasourceName";
request.DB.Username = "DatasourceUsername";
request.DB.Password = "DatasourcePassword";
</cfscript>

<cfquery name="request.someQuery" 
    datasource=request.DB.Datasource 
    username=request.DB.Username 
    password=request.DB.Password>
    --SOME SQL HERE
</cfquery>

<cfquery name="request.someOtherQuery" 
    datasource=request.DB.Datasource 
    username=request.DB.Username 
    password=request.DB.Password>
    --SOME SQL HERE
</cfquery>

<cfquery name="request.aThirdQuery" 
    datasource=request.DB.Datasource 
    username=request.DB.Username 
    password=request.DB.Password>
    --SOME SQL HERE
</cfquery>

Если ваши объекты данных безопасны для существования на уровне приложения (при условии, что здесь источник данных для объекта не изменится во время выполнения и что вы написали поточно-ориентированные CFC) Вы можете хранить и инициализировать DAOна уровне приложения, а затем каждый запрос имеет удивительно простой код, такой как:

<cfscript>
request.someQuery = application.randomDAO.someGetter();
request.someOtherQuery = application.randomDAO.someOtherGetter();
request.aThirdQuery = application.randomDAO.aThirdGetter();
</cfscript>
...