В чем разница между использованием CFINVOKE и CreateObject для запуска функции компонента?

StackOverflow https://stackoverflow.com/questions/4605746

Вопрос

В коде моей компании я часто видел компонентные файлы, используемые путем инициализации объекта этого компонента и вызова методов от объекта. Однако мне кажется несколько простым, чтобы использовать метод CFINVOKE, особенно при использовании одного метода из компонентного файла. Каковы различия между этими 2 методами вызова функции компонента и какие плюсы / минусы каждого? Когда я должен использовать какой?

Это было полезно?

Решение

CFINVOOKE можно использовать только в тегах.

CreateObject можно использовать в обоих тегах и CFScript и имеет тенденцию быть немного сложнее / легче читать IMO.

До недавнего времени я избегал использовать CFINVOKE, потому что я нашел его «громоздким», но про прочем вы можете динамически петли по методам в CFC. В CreateObject вы не можете.

Таким образом, если бы, например, у меня есть CFC, который имеет методы - метод1, метод2, метод3, метод4. Я могу зацикливаться над ними, как так: -

<cfloop from="1" to="4" index="element">
   <cfif structKeyExists(this,'getMethod#element#')>
<cfinvoke component="#this#" method="getLine#local.element#" returnVariable="methodValue"></cfinvoke>
<cfset arrayAppend(myArray,methodValue) />
   </cfif>

--

Другое, что следует отметить, что некоторые совместные хосты блокируются на CreateObject. В основном из-за доступа это дает подчеркивание Java.

Другие советы

Одно другое преимущество использования createObject() это то, что вы можете цепить init() Метод, например

<cfset myObject = createObject("com.path.MyObject").init() />

И если ваш init() возвращается this Вы можете пойти дальше и цепотать метод, если вам не нужно снова использовать объект:

<cfset functionResults = createObject("com.path.MyObject").init().myFunction() />

Стоит указать, что в CF 9 вы можете использовать новый (Ahem) new Синтаксис для создания объектов. Например, чтобы создать тот же объект, что и выше и позвоните, это init() Я могу написать:

<cfset myObject = new com.path.MyObject() />

Это аккуратно, и мне нравится возможность сделать это. CF движется в правильном направлении, на мой взгляд с такими функциями.

Вы почти ответили на него сами: на поверхности можно сказать, что если вы будете вызывать только один метод на странице, то делая в одном падении в CFINVOOKE (что касается CFC и вызывает один по имени) Отказ И, безусловно, если вы будете звонить более одного метода CFC на странице, то отделяя шаги, имеет смысл (создать смысл CFC с функцией CREATEOBJECT или CFOBJECT TAG, затем вызывать методы, на которые можно найти в этом объекте, указатель на CFC) Так что вы не платите эту атмосферу стоить более одного раза.

Но имейте в виду, что если страница часто называется, это может иметь смысл также сохранить этот результат создания CFC, так что его можно повторно использовать в последующем запросе на страницу. Вы сделаете это, хранив его (результат CFObject / CreateObject), а не в локальной переменной, а вместо этого в общем объеме: будь то сервер, приложение или сеанс, основываясь на «кто» из такого повторного использования. Конечно, тогда он действует на вас программно обрабатывать / решить, сколько времени сохранить этот «кэшированный» экземпляр CFC.

Как важно, когда вы сохраняете экземпляр CFC таким образом, вы становитесь более восприимчивыми к «BUG VAR Case Bug», что в основном заключается в том, что вы должны быть более осторожны, чтобы важен, в котором в основном вы должны быть более осторожны, чтобы набрать любые локальные переменные, которые вы создаете в CFC. Вместо того, чтобы попытаться уточнить это, я укажу на мета-ресурс, который я создал на этом:

http://www.carehart.org/blog/client/index.cfm/2010/3/4/resources_on_the_var_scope_problem.

Надеюсь, это поможет.

Скорее, повторите эту дискуссию, я просто уйду тебе в Google:

http://www.google.com/search?q=cfinvoke+vs+createobject

Есть некоторые тонкие различия (т.е. <cfinvoke> способен обращаться с именами динамического метода), но по сути, это просто сводится к личным предпочтениям. Ну, это и тот факт, что вы не можете использовать <cfinvoke>через <cfscript>.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top