Coldfusion 8 - Лучшая практика для доступа к DAO AJAX? - PullRequest
2 голосов
/ 31 августа 2011

Я довольно новичок в использовании ОО-концепций, таких как DAO, шлюзы и т. Д., И я пытаюсь найти наилучший способ реализовать AJAX-доступный CFC, стараясь не повторять много кода.

У меня есть следующий DAO, который содержит методы CRUD для моей таблицы БД и принимает DSN приложения в качестве аргумента в своем конструкторе:

<cfcomponent name="property_imageDAO" displayname="property_imageDAO" output="false" hint="">

<!--- pseudo constructor --->
<cfscript>
    variables.dsn = application.dsn;
</cfscript>

<!--- constructor --->
<cffunction name="init" access="public" output="false" returntype="any"
        hint="Constructor for this CFC">
    <!--- take DSN as argument --->
    <cfargument name="dsn" type="string" required="true" hint="The datasource name" />

    <!--- put dsn in variables scope so we can use it throughout the CFC --->
    <cfset variables.dsn = arguments.dsn />

    <!--- return this CFC --->
    <cfreturn this />
</cffunction>

<!--- CRUD methods (create, read, update, delete) --->
<!--- CREATE: inserts a new property_image into the database --->
<cffunction name="createRecord" access="remote" output="true"
        hint="Creates a new property_image record and returns a struct containing a boolean (success) indicating the success or
        failure of the operation, an id (id), and a string (message) containing a message">

    <!--- take property_image bean as argument --->
    <cfargument name="property_image" type="any" required="true" />

    <!--- initialize variables --->
    <cfset var results = StructNew() />
    <cfset var qInsertproperty_image = 0 />

    <!--- defaults --->
    <cfset results.success = true />
    <cfset results.message = "The record was inserted successfully." />

    <!--- insert the property_image --->
    <cftry>
        <cfquery name="qInsertproperty_image" datasource="#variables.dsn#">
            INSERT INTO property_image (
                name,
                alt 
            )
            VALUES (
                <cfqueryparam value="#arguments.property_image.getname()#" cfsqltype="cf_sql_varchar" />,
                <cfqueryparam value="#arguments.property_image.getalt()#" cfsqltype="cf_sql_varchar" />
            )
        </cfquery>
        <cfcatch type="database">
            <cfset results.success = false />
            <cfset results.message = "Inserting the record failed.  The error details if available are as follows: " & CFCATCH.Detail />
        </cfcatch>
    </cftry>

    <!--- return the struct --->
    <cfreturn StructCopy(results) />
</cffunction>

Должен ли я добавить функциональность в этот DAO, чтобы сделать его доступным для AJAX, или мне следует создать другой DAO специально для удаленного доступа?

Спасибо

Ответы [ 2 ]

3 голосов
/ 31 августа 2011

Я предлагаю взглянуть на ColdSpring и его способность создавать удаленные прокси-серверы и его способность защищать их с помощью AOP. Это отличный способ предоставить удаленному доступу только определенные части CFC и контролировать, к кому они обращаются.

Обе темы описаны в кратком руководстве ColdSpring: http://www.coldspringframework.org/coldspring/examples/quickstart/

Я также сделал презентацию о том, как это сделать. Вы можете увидеть запись здесь: http://textiles.online.ncsu.edu/online/Viewer/?peid=a4227aeb1ad84fa89eeb3817f075af5b1d

3 голосов
/ 31 августа 2011

Я думаю, что есть, вероятно, столько вариантов решения, сколько найдется людей, которые предложат одно, но вот один из них.

Я бы не открывал DAO до УДАЛЕННОГО доступа, я бы оставил это как ПАКЕТ (и доступ к нему осуществлялся только некоторым бизнес-объектом в том же пакете). У меня также был бы какой-то фасад, стоящий перед этой партией, который обрабатывает удаленные вызовы, а также такие вещи, как проверка того, разрешено ли входящий вызов удаленно выполнять вызов. Вы не хотите, чтобы кто-то вставлял вещи в вашу базу данных! Фасад должен иметь дело с аутентичной стороной вещей, тогда, если все ОК передают вызов бизнес-объекту, который затем использует DAO для доступа к БД.

У меня не было бы того, что можно попробовать / поймать в вашем DAO. Лучший способ сообщить вызывающему коду о том, что что-то пошло не так, - создать исключение. Затем вызывающий код может решить, что с ним делать (нужно ли каким-то образом с ним справиться, игнорировать его или повторно направить его на обработку ошибок по всему миру).

...