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

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

4 ответа

Решение

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

createObject может использоваться как в тегах, так и в cfscript, и, как правило, он немного стройнее / легче для чтения IMO.

До недавнего времени я избегал использования cfinvoke, потому что нашел его "громоздким", но его преимуществом является то, что вы можете динамически перебирать методы внутри CFC. В createobject вы не можете.

Так что, если, например, у меня есть CFC, который имеет методы - method1, method2, method3, method4. Я могу зациклить их так:

<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 вы можете использовать новый (хм) new синтаксис для создания объектов. Например, чтобы создать тот же объект, что и выше, и вызвать его init() Я могу написать:

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

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

Вы почти ответили на это сами: на первый взгляд, можно сказать, что если вы будете вызывать только один метод на странице, то делать это одним махом в CFINVOKE (который создает экземпляр CFC и вызывает метод с одним именем), имеет смысл, И, конечно, если вы вызовете более одного метода CFC на странице, тогда имеет смысл разделить шаги (создать экземпляр CFC с помощью функции createobject или тега cfobject, а затем вызвать методы, найденные в этом объекте, указатель на CFC), чтобы вы не платили эту стоимость экземпляра более одного раза.

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

Также важно, что когда вы сохраняете экземпляр CFC таким образом, вы становитесь более восприимчивыми к "ошибке области видимости", которая в основном заключается в том, что вам нужно быть еще более внимательным к VAR-файлам с любыми локальными переменными, которые вы создаете в 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

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

Другие вопросы по тегам