Coldbox getSetting в модели Wirebox Injection

Я пытаюсь получить доступ к Coldbox getSetting в модели.

В документации и в сообщениях группы Google Coldbox четко указано

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

Они указывают на этот документ: http://wiki.coldbox.org/wiki/WireBox.cfm#The_WireBox_Injector

Но кроме несколько сбивающего с толку документа и сообщений группы Google, повторяющих эту цитату выше, нет действительно хорошего примера того, как это сделать.

Я попытался ввести свойство в верхней части моей модели:

<cfcomponent displayname="myComponent" output="false">
    <cfproperty name="mySetting" inject="coldbox:setting:mySetting" />
       <cffunction name="myFunction" output="false" hint="index"> 
          <cfset value = getProperty('mySetting') />
           ...

Это возвращает сообщения об ошибках: Variable GETPROPERTY is undefined.

Я также попытался ввести аргумент в функцию моей модели, но знал, что это не сработает.

<cffunction name="myFunction" output="false" hint="index">
  <cfargument name="mySetting" inject="coldbox:setting:mySetting">

Может ли кто-нибудь показать мне, как передать getSetting модели с помощью внедрения Wirebox или любого другого метода?

Как внедрить зависимость в модель Coldbox?


person Jay Rizzi    schedule 10.04.2014    source источник


Ответы (2)


Ваша инъекция выглядит нормально. Проблема в том, что вы пытаетесь использовать getProperty (), который не определен в вашем компоненте. Он исходит из супертипа фреймворка и существует только в объектах фреймворка, таких как обработчики и т. Д. Внедрение свойств помещает ссылку на внедренный объект непосредственно в область «переменных» по умолчанию, так что вы просто обращаетесь к нему как переменные .mySetting.

Вы также можете управлять областью, в которую вводится свойство, с помощью атрибута scope:

http://wiki.coldbox.org/wiki/WireBox.cfm#Property_Annotation

Внедрение аргументов ДЕЙСТВИТЕЛЬНО работает, но только для конструкторов (init), поскольку они автоматически вызываются механизмом DI.

Кроме того, эта справочная карта может быть немного проще для чтения, чем полная документация WireBox, но она, очевидно, не охватывает столько информации: https://github.com/ColdBox/cbox-refcards/raw/master/WireBox/WireBox-Refcard.pdf

Отказ от ответственности: я являюсь частью Team ColdBox.

person Brad Wood    schedule 10.04.2014
comment
Я пробовал использовать variables.mySetting, он выдал ошибку, переменная undefined - person Jay Rizzi; 11.04.2014
comment
Ну, вдруг он начал работать с переменными. MySetting, может проблема с кешем ... спасибо и за карту, пригодится - person Jay Rizzi; 11.04.2014
comment
Рад слышать, что это работает. Помните, вам необходимо повторно инициализировать структуру, даже если объект, получающий инъекцию, является временным, поскольку метаданные для сопоставления кэшируются в WireBox для повышения производительности. - person Brad Wood; 11.04.2014
comment
Последний вопрос: если бы я поместил его в конфигурацию Wirebox вместо инъекции свойств в модель, где бы я его разместил? вот суть конфигурации Wirebox, сейчас она просто по умолчанию gist.github.com/Jrizzi1/10488828 - person Jay Rizzi; 11.04.2014
comment
Явные сопоставления, если вы решите их использовать, перейдите туда, где находится комментарий // привязки карты ниже. См. Образец конфигурации связующего WireBox, который я оставил в другом комментарии. - person Brad Wood; 11.04.2014

В /config/WireBox.cfc вы настраиваете псевдонимы для своих объектов модели:

map('KungFooDAO').to('model.path.to.KungFooDAO');

Вы можете ввести параметр ColdBox как свойство прямо здесь:

map('KungFooDAO').to('model.path.to.KungFooDAO')
    .property(name='myDsn', dsl='coldbox:datasource:myDsn');

Теперь внутри KungFooDAO.cfc вы можете ссылаться на variables.myDsn, который имеет значение параметра ColdBox.

В качестве альтернативы вы можете оставить вызов .property() в конфигурации WireBox и добавить CFPROPERTY внутри KungFooDAO.cfc следующим образом:

<cfproperty name="myDsn" inject="coldbox:datasource:myDsn" />

Эти примеры взяты из реального кода (имена DSN изменены для защиты невиновных).

Как выглядит ваша запись WireBox для вашей модели CFC?

person Adrian J. Moreno    schedule 10.04.2014
comment
Я еще не разместил его! Я попробую это утром первым делом. P.S. восхищаюсь твоей работой, использую несколько твоих плагинов с github - person Jay Rizzi; 11.04.2014
comment
где разместить карту в функции configure () {wireBox = {}}? - person Jay Rizzi; 11.04.2014
comment
DSL сопоставления находится внутри метода configure (), но находится за пределами объявления структуры Wirebox. См. Этот пример: github.com/ColdBox/ coldbox-samples / blob / master / applications / Конечно, имейте в виду, что отображение DSL является альтернативой простому размещению аннотаций и свойств непосредственно в вашем CFC. Два средства для достижения одной цели. - person Brad Wood; 11.04.2014