Я написал пару приложений на CF, которые используют хранилища данных NoSQL - одно использует хранилище данных Google App Engine, а другое - MongoDB.
В обоих случаях я сделал CFC для своих объектов.Но я использовал доморощенный объектный «каркас», который использует onMissingMethod для средств доступа и cfproperty с множеством пользовательских метаданных для определения свойств объектов.
Например, это все, что мне НУЖНО определить для модели,если у него нет собственной бизнес-логики:
<cfcomponent output="false" persistentLayer="GAE" persistentClass="asana" extends="com.bespokelogic.framework.BaseModel">
<cfproperty name="id" type="string" persistentDatatype="string" settable="true" gettable="true" required="true">
<cfproperty name="deckSet" type="string" persistentDatatype="string" settable="true" gettable="true" default="basic">
<cfproperty name="englishName" type="string" persistentDatatype="string" settable="true" gettable="true">
<cfproperty name="traditionalName" type="string" persistentDatatype="string" settable="true" gettable="true">
<cfproperty name="pronunciation" type="string" persistentDatatype="string" settable="true" gettable="true">
<cfproperty name="anatomicalFocus" type="array" persistentDatatype="array" settable="true" gettable="true" default="#arrayNew(1)#">
<cfproperty name="therapeuticFocus" type="array" persistentDatatype="array" settable="true" gettable="true" default="#arrayNew(1)#">
<cfproperty name="benefits" type="string" persistentDatatype="string" settable="true" gettable="true">
<cfproperty name="variations" type="string" persistentDatatype="string" settable="true" gettable="true">
<cfproperty name="contraindications" type="array" persistentDatatype="array" settable="true" gettable="true" default="#arrayNew(1)#">
<cfproperty name="skill" type="string" persistentDatatype="string" settable="true" gettable="true">
<cfproperty name="instructions" type="string" persistentDatatype="string" settable="true" gettable="true">
</cfcomponent>
Все CFC расширяют базовую модель, которая имеет методы проверки, сериализации, десериализации и виртуального метода получения / установки.
Затем у меня есть уровень персистентности, который знает, как получать и помещать объекты из / в хранилище данных.
Затем я бы написал сервис для каждой из моделей, использующих уровень персистентности.
В результате модели знают, как сериализовать данные своих свойств, а уровень сохраняемости знает, как поместить их в хранилище данных.
Так что, в некотором смысле, это не объектно-реляционный менеджер, а скорее менеджер объектных документов.
Фреймворк гораздо более полнофункциональный в реальности, поскольку мой дизайн заключался в том, чтоЯ беру некоторые модели и сохраняю их в SQL, некоторые в NoSQL, все в одном приложении - и я могу поменять базовое хранилище данных без перекодирования приложения.Это был частичный успех.
В вашем случае, если вы используете одно хранилище данных, вы можете пропустить все эти сложные вещи.
Вам просто нужен базовый объект, который знает, как сериализоватьи десериализовать модели, и вы получите геттер / сеттер.Решите, как вы хотите хранить данные свойств в CFC.Я использовал структуру с именем "variables.instance._properties {}"
Затем напишите сервис для ваших моделей, который имеет методы "put" и "fetch".Например, метод «put» берет модель, вызывает для нее метод «serialize», чтобы превратить ее в JSON, а затем вставляет в Mongo.Метод «fetch» получает запись Mongo, создает новый экземпляр CFC и передает запись Mongo методу десериализации.
Это было довольно бессвязно ...
TL; DR: «Объекты в CF (как они есть) на самом деле не являются статичными. Используйте CFC. Используйте onMissingMethod, чтобы разрешить динамические свойства. Храните свойства таким образом, чтобы сериализовать и десериализовать их в формате (обычно JSON), которыйлегко усваивается вашим хранилищем данных. Напишите простой слой постоянства, который получает и помещает документы в / из хранилища данных. Напишите простые сервисы, которые реализуют ваш уровень сохраняемости и принимают и возвращают вам динамические модели.
CF довольно хорошо подходит для NoSQLпо моему.