Pergunta

Eu escrevi uma porta de entrada para obter um conjunto de resultados do meu banco de dados. Como faço para armazenar cada linha em um dao separada para que eu possa manipular cada registro mais? Ou eu posso acessar o conjunto de resultados diretamente para obter os registros?

Este é o meu Gateway (btw, eu deveria escrever a lógica condicional dentro do cfquery em um cfc separado que se estende este?)

<cfcomponent name="MaterialDao" hint="data access object" output="false">
 <cffunction name="init" hint="constructor" access="public" output="false" returntype="MaterialDao">
  <cfargument name="dsn" type="String" required="true" hint="datasource" />
  <cfset variables.instance.dsn = arguments.dsn />
  <cfreturn this />
 </cffunction>

 <cffunction name="readMaterial" hint="read" access="public" output="false" returntype="Query">
  <cfargument name="district" type="String" />
  <cfset var qReadMaterial = "" />
  <cfquery name="qReadMaterial" datasource="#variables.instance.dsn#">
   <cfif StructKeyExists(arguments,"district")>
   SELECT A.NR, A.BEZ, D.BES, D.STA
   <cfelse>
   SELECT A.NR, A.BEZ
   </cfif>
   FROM  DEK AS D INNER JOIN ART AS A
   ON D.NR = A.NR
   WHERE 0=0
   <cfif StructKeyExists(arguments,"district")>
    AND D.BEZ = #arguments.district#
   </cfif>
   ORDER BY A.BEZ
 </cfquery>
 <cfreturn qReadMaterial />
 </cffunction>
</cfcomponent>

Já li um monte de artigos e parece que há diferentes opiniões sobre este assunto (DAO vs. Gateway, DAO & gateway etc.). Qual é a melhor prática, o que os profissionais fazem?

Foi útil?

Solução

Os profissionais usam apenas um padrão para a camada de acesso a banco de dados. A utilização de ambos um DAO e Gateway é um equívoco que eu não estou realmente certo de onde ele começou, mas parece só existem na multidão ColdFusion. Os padrões DAO e Gateway pode muito bem servir a mesma função, mas acho que o DAO se encaixa no projeto mais quando se fala sobre a interação de banco de dados.

DAOs deve incluir funcionalidade para métodos CRUD mais conjuntos de retorno de registros. Desde CRUD e conjuntos básicos de registros é altamente repetitiva, eu uso um gerador de código para criar o código para essa interação e, em seguida, personalizar o que eu preciso. Este é um bom lugar para a lógica condicional para selecionar os registros que você precisa.

Como Aaron mencionado, retornando um array de objetos para um conjunto de registros em seu banco de dados é inviável no ColdFusion devido a sobrecarga de criação de objetos do desempenho. Eu normalmente só usar a consulta básica voltou do DAO em meus pontos de vista. No entanto, se a coisa que eu sou modelagem precisa de algum comportamento em uma visão, então eu vou colocar a consulta em um objeto usando algo semelhante ao que Peter Bell faz.

Outras dicas

Peter Bell tinha uma grande apresentação há alguns meses em sua libertação do CFC objeto Iterating negócio que lhe permite tirar várias registros e interagir sobre um registro de cada vez usando este quadro simples: http://ibo.riaforge.org/ . Até CF é um pouco mais rápido na geração de objetos, a reciclagem de uma única instância de um objeto e repovoamento das propriedades é provavelmente o seu melhor melhor. Talvez isso possa ajudá-lo a carregar um registro de cada vez em sua DAO.

condicional lógica pode ir no Gateway ou em um CFC Manager. Normalmente, eu iria incluir lógica que é simples como a lógica descrita no seu post diretamente no CFC.

Um pouco de conselho, você pode querer fazer a arguments.distinct não requereu e fazer uma verificação simples, com if (structKeyExists (argumentos, "distinto")) {fazer algo}.

Saudações,

-Aaron Greenlee

Na nossa empresa temos pensado muito sobre este material por alguns meses, tentando o criador Adobe CF DAO via RDS e alguns outros mais velhos (alguém se lembra CFPowerTools?).

Decidimos no final de escrever nosso próprio gerador de código DAO e eu pensei que eu iria partilhar os nossos pensamentos aqui. A razão decidimos foi porque precisávamos para adicionar dicas de bloqueio para fora SQL, queríamos torná-lo mais eficiente, mais seguro e mais limpo.

A configuração nós decidimos era criar uma base objeto DAO pré-definido (chamado DAO.cfc) que todos os DAOs 'table' gerados estendido. Tudo o que tinha era de alguns métodos de utilitário, mas a coisa chave coisa é que podemos acrescentar quaisquer outras funções aí que precisamos de todas as nossas DAOs gerados para ter acesso.

Então, nós auto-gerar o código, selecionando uma tabela do banco de dados (usando o administrador API CF) e criar o DAO [TableName].cfc com init habituais, setters e getters, então as coisas básicas CRUD.

Além disso, nós também gerar um [TableName]GatewayBase.cfc e uma [TableName]Gateway.cfc. [TableName]Gateway.cfc estende [TableName]GatewayBase.cfc.

Assim, para uma corrida DAO amostra em uma tabela chamada 'clientes', os arquivos criados são:

Customers.cfc /* extends DAO.cfc [not created, already exists] */
CustomersGateway.cfc 
CustomersGatewayBase.cfc /* extends CustomersGateway */

Assim, a idéia é que o gateway fornece uma maneira de lidar com muitos registros de 'cliente' - o DAO é usado quando se lida com uma e apenas uma. Todos os métodos na gateway irá geralmente retornam um objeto de consulta CF. CF é muito ineficiente para criar matrizes enormes de objetos DAO e em nossa mente o objeto de consulta na CF é realmente flexível, por isso estamos felizes de usá-lo.

Quando a codificação, a CustomerGateway.cfc sub-classe é o único instanciado e usado. No entanto, a classe de base que se estende tem algumas funções muito úteis genéricos que vêm para livre, tais como getFieldListByProperty() que com base nos parâmetros passados ??voltará certos campos (colunas da tabela ie) por uma determinada propriedade (isto é, um valor de coluna), Assim, por exemplo:

myGateway.getFieldListByProperty(property="status", value="1", fieldList="customerName,customerID", orderBy="createdOn") />

Essa chamada retornará o 'customerName' e valores 'CódigoDoCliente' para todos os clientes com um status de 1, ordenados por data em que foram criados no. O código também é endurecido contra injeção de SQL e validado por isso exceções sensatas são jogados.

Esta função irá fornecer 99% (esperamos!) Do multi-registro consultando você faz sobre uma mesa. Se você precisar de uma consulta mais sophisiticated então o CustomerGateway.cfc está lá para você adicionar funções para.

Finalmente, permitir que você adicionar funções ao CFC CustomerGateway única , porque se você alterar a tabela de clientes (digamos adicionar uma coluna), você terá de recriar a tabela, e tha irá substituir a Customers.cfc e o CustomersGatewayBase.cfc. No entanto, o código personalizado (se houver) é seguro na sub-classe.

De qualquer forma, isso pode ser um pouco off topic, mas com certeza eu pensei que alguém pode encontrar a nossa experiência útil.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top