none
Desenvolvimento em camadas RRS feed

  • Pergunta

  • Olá amigos,

     

    Ainda estou engatinhando no desenvolvimento em camadas e estou quebrando a cabeça com o conceito.

    Estou construindo um aplicativo usando o Visual Studio 2005 e a linguagem C#. Este aplicativo eu dividi nas seguintes camadas:

    Camada 1: Esta é a camada de acesso aos dados. Criei um dataset tipado onde cada tabela do dataset representa uma tabela no banco de dados com os comandos de SELECT, UPDATE, INSERT e DELETE no table adapter. Criei também os relacionamentos entre elas.

    Camada 2: Os objetos que representam as necessidades do sistema com suas respectivas “regras de negócio”. Para cada objeto, criei também um “BindListView” para que eles possam ser exibidos em um DataGridView. Por exemplo: criei um objeto “Cliente” que representa cada cliente individualmente e um objeto “ICliente” que implementa a classe BindListView sendo este uma coletânea de objetos “Cliente”.

    Camada 3: Os forms do projeto.

    O meu maior problema está na camada 2 e está exemplificado abaixo.

    Eu tenho duas tabelas sendo uma de clientes e outra de contatos (representa cada contato feito com o cliente indicando o dia que foi feito o contato e uma observação sobre este). No objeto Cliente já possuo uma propriedade “contatos” do tipo “IContato” que me traz os contatos feitos com o cliente, mas gostaria de ter também uma propriedade do tipo bool “JaFezContato” para ser exibida em um DataGridView, assim poderia mostrar para o usuário uma listagem com os clientes com os quais ainda não foi feito contato.

     Eu faria facilmente isto com uma query do tipo:

     

     “select clientes.*, contato.data from clientes left join contatos on clientes.codcliente = contato.codcliente group by clientes.codcliente”.

     

    Todos os contatos cuja data seja null são os que ainda não foram feito contato, mas como na camada 2 não devo acessar o banco e na camada 1 cada tabela tem que representar uma tabela no banco, estou com um problema de performance. Hoje crio o objeto ICliente pegando os dados da tabela cliente e percorrendo depois a tabela contatos para ver os que ainda não foram feito contato, tudo isso dentro do dataset. A performance não chega a tornar o sistema inviável, mas me incomoda a idéia de ter que fazer isto sendo que poderia ser mais rápido.

    Onde está meu erro: no conceito das camadas? Na implementação?

    Por favor, se alguém tiver alguma sugestão ou indicação de artigos ou livros que possam me ajudar, eu agradeço.
    quarta-feira, 29 de novembro de 2006 12:10

Respostas

  • Grande Luis,
    Essa sua dificuldade é comum a todos... como implementar um modelo extensível, porém, performático usando OO.

    Um ponto importante a destacar é que suas classes de entidade (classes criadas por você que representam as tabelas do banco) ou mesmo o dataset tipado, podem incluir campos a mais do que sua tabela no banco de dados.

    A camada DAL (Data Access Layer) nada mais faz do trabalha com banco de dados. Seu dataset (ou classe de negócio) pode muito bem acomodar uma coluna a mais (podendo ser nula) e que represente essa informação, concorda?

    Como poderia ser implementado?
    1. Crie um campo no dataset que indicará se "JaFezContato" (podendo ser nulo);
    2. Crie um método que busque essa informação e retorne o dataset apenas com essa informação (ou altere alguma outra consulta para retornar um campo a mais);

    Daí pra frente acredito que você consiga evoluir a solução.

     

     

    Abraços

    sexta-feira, 15 de dezembro de 2006 19:05

Todas as Respostas

  • Grande Luis,
    Essa sua dificuldade é comum a todos... como implementar um modelo extensível, porém, performático usando OO.

    Um ponto importante a destacar é que suas classes de entidade (classes criadas por você que representam as tabelas do banco) ou mesmo o dataset tipado, podem incluir campos a mais do que sua tabela no banco de dados.

    A camada DAL (Data Access Layer) nada mais faz do trabalha com banco de dados. Seu dataset (ou classe de negócio) pode muito bem acomodar uma coluna a mais (podendo ser nula) e que represente essa informação, concorda?

    Como poderia ser implementado?
    1. Crie um campo no dataset que indicará se "JaFezContato" (podendo ser nulo);
    2. Crie um método que busque essa informação e retorne o dataset apenas com essa informação (ou altere alguma outra consulta para retornar um campo a mais);

    Daí pra frente acredito que você consiga evoluir a solução.

     

     

    Abraços

    sexta-feira, 15 de dezembro de 2006 19:05
  • Olá Thiago,

     

    Obrigado pela dica. Acabei colocando esta dúvida em outro tópico e ela também já foi respondida por lá. Se quiser acompanhar o link é: http://forums.microsoft.com/MSDN-BR/ShowPost.aspx?PostID=970389&SiteID=21

    Adotei também esta técnica que você falou. Como todas as classes criadas pelo dataset tipado são “partial”, criei um arquivo de “complementando” o tableadapter da tabela onde implemento os métodos getdata e fill preenchendo os campos que não fazem parte da tabela original.
    segunda-feira, 18 de dezembro de 2006 10:36