2007-06-24

Duplicate CFC tem funcionalidade?

Com a nova funcionalidade da função Duplicate agora podemos armazenar o contexto completo da sessão, incluindo variáveis do tipo componente.
Antes para que uma variável do tipo componente criada durante uma sessão, que tem tempo de vida predefinido, não fosse perdida em sessões futuras, o desenvolvedor precisava de alguma POG, utilizando WDDX, ou algum código extenso, copiando as variáveis contidas no objeto componente. Esta nova funcionalidade do Duplicate será uma 'mão na roda'.
Tenho visto alguns criando componentes e copiando-o sem se quer iniciar o componente. Não aconselho. Aconselho o uso do createobject (component).

Para um exemplo simples, imagine uma aplicação onde uma montadora de veículos possui o Carro.cfc, e tudo mais acima dele, e a cada sessão (web) de um gerente de qualquer setor, encarregado de uma parte específica do projeto, ele precise ter armazenado o histórico do que seu setor (sua sessão web) implementou, a dias ou semanas atrás, em um carro em particular, ou mesmo em todos os carros.

Sabendo que todas as propriedades do Carro estarão no objeto Carro, fica mais simples armazenar este objeto em um escopo mais persistente (aqui chamo atenção dos desenvolvedores que dispõem de servidores compartilhados - este procedimento NÃO é apropriado, CASO a jvm seja a mesma para todo o servidor).

Com Duplicate(CFC) isto se resume a um script de no mínimo 23 linhas no Application.cfc, bastando usar o escopo session para criar novos Carro.cfcs com o createobject.

<cfcomponent>

<cfset this.name = "Montadora">
<cfset this.sessionmanagement = true>

<cffunction name="onApplicationStart">
<!--- Atenção com servidores compartilhados --->
<!--- cria variável que conterá todos os contextos de todas as sessões --->
<cfset Application.contextsaved = {} >
<cfreturn true>
</cffunction>

<cffunction name="onSessionEnd">
<cfargument name="SessionScope">
<cfargument name="ApplicationScope">
<!--- Cria variável expired com horario corrente no escopo this do componente --->
<cfset SessionScope.carro.expired = now() >
<!--- com o fim da sessão, armazeno o contexto do carro corrente no escopo application --->
<cfset ArrayAppend(ApplicationScope.contextsaved[CGI.REMOTE_ADDR],Duplicate(SessionScope.carro))>
</cffunction>

<cffunction name="onSessionStart">
<cfif StructKeyExists(Application.contextsaved,CGI.REMOTE_ADDR) and ArrayLen(Application.contextsaved[CGI.REMOTE_ADDR])>
<!--- sessão corrente possui histórico, que é restiduido --->
<cfset Session.carros = Application.contextsaved[CGI.REMOTE_ADDR] >
<cfelse>
<!--- sessão corrente NÃO possui histórico --->
<cfset Application.contextsaved[CGI.REMOTE_ADDR] = [] >
<cfset Session.carros = [] >
</cfif>
<!--- Cria a variável carro --->
<cfset Session.carro = {} >
</cffunction>

</cfcomponent>



Isto tornará cada item do array session.carros um objeto com as propriedades e métodos intactos, após o término da manipulação de carro em especial.
E o desenvolvedor pode atribuir manualmente um novo carro no histórico (<cfset ArrayAppend(Application.contextsaved[CGI.REMOTE_ADDR],Duplicate(Session.carro))>), antes mesmo da sessão expirar.

Nenhum comentário: