Есть несколько вариантов, чтобы заставить это работать.К сожалению, изучение их заняло у меня много проб и ошибок.Позвольте мне поделиться тем, что я узнал.
Сначала , вы можете использовать классический метод создания сопоставления в вашем CF Administrator.Укажите точный путь к вашим компонентам (например, c:\wwwroot\cfc
) и отображение (псевдопапка), по которому вы хотите вызвать его (например, MyCFCs
).Теперь в любом месте вашего приложения вы можете ссылаться на создание new MyCFCs.mycomponent()
(используя ключевое слово CF9 + new
, вы можете заменить createObject ("component", "MyCFCs.mycomponent"), чтобы он был обратно совместим с CF6).
Недостатками использования сопоставления серверов являются то, что вы должны настроить это на каждом сервере, на котором работает ваше приложение.Обычно у меня есть локальный сервер разработки, который имеет радикальную конфигурацию, отличную от моих производственных серверов, и внесение изменений на производственных серверах является для меня проблемой, поэтому я стараюсь по возможности избегать сопоставлений серверов.
Второй, вы можете ссылаться на свои CFC по пути, относящемуся к корневому веб-сайту, это означает, что если ваше приложение находится в корне вашего сервера, а путь /cfc
находится вне корневого веб-каталога, вы всегда можете сделать new cfc.mycomponent()
из любого места в вашем приложении.ColdFusion 6.1 и выше будет правильно отображаться в корне вашего веб-сайта.Это похоже на ссылку на изображение с помощью /images/mypicture.jpg
, где угодно на вашем веб-сайте, /images
перейдет прямо в тот же каталог.
Недостатком использования пути относительно корня веб-сайта является то, что если вашКогда-либо приложение будет находиться в другой папке вне корневого веб-каталога, или когда-либо будет находиться в подкаталоге, а иногда и в корневом веб-каталоге, относительный путь из корневого веб-каталога будет изменяться, нарушая эти ссылки.
Третий , вы можете создать привязку для конкретного приложения.Это было введено в CF8 и требует наличия файла Application.cfc
.Это просто добавить.У Раймонда Камдена есть отличная ссылка .Синтаксис по сути такой:
<cfset this.name = "MyAppName"/>
<cfset this.mappings = structNew() />
<cfset this.mappings["/cfc"] = getDirectoryFromPath(getCurrentTemplatePath()) & "cfc/" />
Единственным недостатком этого метода является то, что ваш Application.cfc не может расширять CFC в сопоставленной папке.Это неясная проблема, которая, вероятно, не повлияет на вас.Кроме того, вам понадобится Application.cfc, что является хорошей практикой, но я не знаю, делаете ли вы это еще.
Четвертый , вы можете создать свой CFC вобласть вашего приложения, вероятно, из вышеупомянутого Application.cfc, внутри метода OnApplicationStart()
.Это перемещает любое время компиляции / создания экземпляра в первое попадание вашего приложения и удаляет его из последующих попаданий.Код очень прост.
<!--- from Application.cfc, inside onApplicationStart() --->
<cfset application.myComponent = new cfc.myComponent() />
<!--- from anywhere else in your application --->
<cfset application.myComponent.callMyMethod() />
Недостатком этого является то, что, как только ваш компонент находится в памяти приложения, любые изменения, внесенные в него во время разработки приложения, не будут отражены, пока вы не очиститепамять приложения или вызовите onApplicationStart () снова.Это не сложно обойти, но это просто больше кода и больше для управления.
Последнее замечание , вы можете подумать о переходе с <cfinvoke>
на createObject("component",...)
или, если вы на CF9, new
.Синтаксис cfinvoke хорош, но каждый раз, когда вы вызываете компонент из пути, вы заново создаете его экземпляр, и это также не очень объектно-ориентированный способ вызова ваших компонентов.Пища для размышлений, возьми или оставь:)