Расширение ColdFusion с широкими возможностями UDF
Я изучаю различные методы структурирования своих приложений ColdFusion, и я ищу несколько мнений о том, как наилучшим образом предоставить широко распространенные UDF приложения.
Для каждого из моих приложений я обычно использую кучу дополнительных функций, которые на самом деле не принадлежат ни одному конкретному объекту. В основном обрабатываются данные.
Я хочу, чтобы эти функции были доступны во всем моем приложении, как для использования в шаблонах CFM, так и в CFC-приложениях, реализованных в приложении.
То, как я вижу это, есть различные способы достижения этого, но все они имеют свои собственные ограничения:
-
Создайте экземпляр базового Utils CFC в области приложения.
Это метод, который я использовал чаще всего. Все функции доступны в широком доступе, но если я создам один и тот же CFC из нескольких приложений, тогда у каждого из них будет своя собственная область приложения - это означает, что каждый из них должен создать экземпляр собственного базового Utils CFC.
В этом нет ничего плохого, но мне кажется, что я недостаточно инкапсулирую ХФУ. Я не хочу ссылаться на область приложения изнутри CFC.
-
Создайте базу Utils CFC и сделайте все остальные CFC.
Это прекрасно работает, и это означает, что CFC может ссылаться на функции Utils непосредственно из области CFC THIS. Однако это означает, что функции Utils хранятся в памяти для каждого CFC.
Это также не соответствует концептуально, так как мои другие CFC не имеют отношения к CFC Utils.
-
Внесите мою базу Utils CFC в мои другие CFC.
Другой метод, с которым я играл, - это создать экземпляр базового Utils CFC в области приложения, но затем передать это как объект для аргумента в других моих CFC.
Это работает для меня концептуально и для инкапсуляции. Точно так же, как я установлю свои источники данных в моем методе init, я могу сделать то же самое с моими UDF.
Это связано с тем, что UDF включены в каждый CFC. Когда я сбрасываю все свои CFC, я получаю каждый UDF несколько раз - однако, когда я передаю экземпляр объекта, я предполагаю, что он не занимает лишнее пространство памяти.
Если кто-нибудь сможет подтвердить это, было бы полезно - я просто предполагаю!
Единственная реальная проблема, с которой я сталкиваюсь, заключается в том, что она кажется немного запутанной.
-
Попросите мою прикладную CFC расширить мой Utils CFC.
Это то, что, по-видимому, делает множество фреймворков. Я не использовал этот метод, но я уверен, что есть плюсы и минусы.
-
CFInclude мои UDF из отдельных шаблонов, непосредственно в Application.cfc
Это функционально похоже на создание экземпляра в области приложения.
-
Добавьте мои UDF на сервер Components.cfc
Это теоретическая идея: я могу поддерживать одну копию базовых Utils и быть уверенным, что все на сервере может получить к ним доступ. Однако, если я хочу запускать приложения на нескольких серверах, тогда им все эти функции нужны. Кроме того, любое обновление сервера может перезаписать компоненты.
Это просто похоже на взлом ядра - я уверен, что мы все можем искупить от горького опыта, это плохо.
Итак - мой вопрос таков:
Какова наилучшая практика для расширения CF с UDF в элегантном и многоразовом режиме? Любой из вышеперечисленных вариантов или что-то, о чем я не думал?
Ответы
Ответ 1
Если вы действительно обеспокоены структурой и сохраняете независимость, даже не начинайте с одиночных или наследований, расширяющих функциональность. Вместо этого добавьте базовую функциональность в ColdFusion, добавив вашу некомпонентную библиотеку во время выполнения/запрос, см. Руководство разработчика ColdFusion. Это не магически решает все проблемы, но, по крайней мере, это правильный способ реализации функций общего назначения.