none
Desenvolvimento em 3 camadas RRS feed

  • Pergunta

  • Colegas,

    Tenho um projeto desenvolvido em 3 Camadas, após preencher uma tabela pelo DAL, preciso manipular seus valores "atribuição da BLL", gostaria de saber se eu inserir uma referencia no DAL para a BLL estaria infrigindo alguma regra do desenvolvimento em 3 camadas.

    Estou com um casso que após o preenchimento de uma tabela preciso imediatamente, alterar / manipular os valores do DataSet, como so tenho as informações da Tabela preenchido pela DAL, não sei se incluir uma referência para BLL seria correto.

    BLL = Business Logic Layer - Classes de regra de negócios
    DAL = Data Acess Layer - Classe de conexão com a base

    Obrigado
    Bene
    Benedito Santana - São Paulo/SP - Sua pergunta foi respondida ? Marque-a !
    quinta-feira, 11 de fevereiro de 2010 14:57

Respostas

  • Olá Benedito,

    Partindo do princípio que a sua camada de negócios (BLL) *depende* da sua camada de acesso a dados (DAL) para obter as informações que depois são utilizadas nas suas regras de negócio, é errado referenciar a BLL na DAL.

    Aliás, se forem projetos separados (mais comum), o Visual Studio nem irá deixar... Irá dizer que trata-se de uma referência circular.

    Abraços,
    Caio Proiete



    Caio Proiete      
    Microsoft MVP, MCT, MCPD, MCTS, MCSD 
    http://www.caioproiete.com

    quinta-feira, 11 de fevereiro de 2010 23:32
    Moderador
  • Benedito,
    nao sei exatamente qual sua necessidade no que toca a negócio, mas sugiro a seguinte analise:

    Se sua camada BLL é de negócio por definicao, o ideal é que ela seja capaz de resolver a sua pendencia de lógica de negocio sozinha. Seja tendo que ir mais de uma vez ao banco ou nao.

    Com isso, minha sugestao é que voce pegue os valores necessarios, crie sua logica de condicao na BLL, seja por chamadas a metodos de negocio, seja atraves de classes que portem essa logocia, e depois de atendidas sua condicoes referentes aos valores, voce pegue todo o bloco de estruturas geradas e mante ao banco atraves da DAL.

    A DAL nao deve fazer referencia a BLL na forma que voce apresentou. A unica maneira de voce criar a possibilidade delas se comunicarem sem problemas é atraves de injecao de dependencia. Pense sempre em tornar sua DAL autonoma no que se refere a logica de negocio e ela nao deve ficar pensando em banco, o banco é um mero detalhe. Depois de ter resolvido todo o negocio e pendencias ai vc manda a DAL persistir.

    Abs


    Gustavo Rocha, MCP,MCTS,MCPD,CSM http://subindoaladeira.wordpress.com/
    quarta-feira, 17 de fevereiro de 2010 03:40
  • Caro Caio,

    Tenho uma solução com 8 projetos, um deles é Businnes Logic Layer e outro DataAcess Layer, não sei como fazer para no DAL, preencher uma tabela e dependendo do seu conteúdo alterar as informações da tabela e continuar na sub do DAL preenchendo outras tabelas. "Por isto queria chamar a BLL de dentro da DAL para executar minha regra de negocios".

    Tudo isto para fazer em uma só conexão SQL.

    Outra forma:

    Seria contruir na BLL chamadas ao DAL para preencher uma tabela, receber o resultado e executar novamente a DAL em uma nova conexão SQL.

    Eu temo que isto fique lento, mas sequindo a estrutura de camadas me parece mais apropriado.

    O que devo fazer?

    Obrigado
    Bene


    Benedito Santana - São Paulo/SP - Sua pergunta foi respondida ? Marque-a !
    sexta-feira, 12 de fevereiro de 2010 11:57
  • Olá,

    você pode também usar Transaction Scope em alguns casos, que nada mais é do que tentar manter o desacoplamento, ligando a camada de negócios um pouco mais com a de dados:
    MSDN Transaction Scope

    Atenção para o comentário bem abaixo no exemplo de código
            'The Complete method commits the transaction. If an exception has been thrown,
    
    ' Complete is called and the transaction is rolled back.
    Ou seja, caso de qualquer problema, um RollBack Transaction é feito garantindo a integridade dos dados.

    Espero ter ajudado.

    Abraços
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand" (Martin Fowler)
    segunda-feira, 22 de fevereiro de 2010 11:43

Todas as Respostas

  • Olá Benedito,

    Partindo do princípio que a sua camada de negócios (BLL) *depende* da sua camada de acesso a dados (DAL) para obter as informações que depois são utilizadas nas suas regras de negócio, é errado referenciar a BLL na DAL.

    Aliás, se forem projetos separados (mais comum), o Visual Studio nem irá deixar... Irá dizer que trata-se de uma referência circular.

    Abraços,
    Caio Proiete



    Caio Proiete      
    Microsoft MVP, MCT, MCPD, MCTS, MCSD 
    http://www.caioproiete.com

    quinta-feira, 11 de fevereiro de 2010 23:32
    Moderador
  • Caro Caio,

    Tenho uma solução com 8 projetos, um deles é Businnes Logic Layer e outro DataAcess Layer, não sei como fazer para no DAL, preencher uma tabela e dependendo do seu conteúdo alterar as informações da tabela e continuar na sub do DAL preenchendo outras tabelas. "Por isto queria chamar a BLL de dentro da DAL para executar minha regra de negocios".

    Tudo isto para fazer em uma só conexão SQL.

    Outra forma:

    Seria contruir na BLL chamadas ao DAL para preencher uma tabela, receber o resultado e executar novamente a DAL em uma nova conexão SQL.

    Eu temo que isto fique lento, mas sequindo a estrutura de camadas me parece mais apropriado.

    O que devo fazer?

    Obrigado
    Bene


    Benedito Santana - São Paulo/SP - Sua pergunta foi respondida ? Marque-a !
    sexta-feira, 12 de fevereiro de 2010 11:57
  • Benedito,
    nao sei exatamente qual sua necessidade no que toca a negócio, mas sugiro a seguinte analise:

    Se sua camada BLL é de negócio por definicao, o ideal é que ela seja capaz de resolver a sua pendencia de lógica de negocio sozinha. Seja tendo que ir mais de uma vez ao banco ou nao.

    Com isso, minha sugestao é que voce pegue os valores necessarios, crie sua logica de condicao na BLL, seja por chamadas a metodos de negocio, seja atraves de classes que portem essa logocia, e depois de atendidas sua condicoes referentes aos valores, voce pegue todo o bloco de estruturas geradas e mante ao banco atraves da DAL.

    A DAL nao deve fazer referencia a BLL na forma que voce apresentou. A unica maneira de voce criar a possibilidade delas se comunicarem sem problemas é atraves de injecao de dependencia. Pense sempre em tornar sua DAL autonoma no que se refere a logica de negocio e ela nao deve ficar pensando em banco, o banco é um mero detalhe. Depois de ter resolvido todo o negocio e pendencias ai vc manda a DAL persistir.

    Abs


    Gustavo Rocha, MCP,MCTS,MCPD,CSM http://subindoaladeira.wordpress.com/
    quarta-feira, 17 de fevereiro de 2010 03:40
  • Olá,

    você pode também usar Transaction Scope em alguns casos, que nada mais é do que tentar manter o desacoplamento, ligando a camada de negócios um pouco mais com a de dados:
    MSDN Transaction Scope

    Atenção para o comentário bem abaixo no exemplo de código
            'The Complete method commits the transaction. If an exception has been thrown,
    
    ' Complete is called and the transaction is rolled back.
    Ou seja, caso de qualquer problema, um RollBack Transaction é feito garantindo a integridade dos dados.

    Espero ter ajudado.

    Abraços
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand" (Martin Fowler)
    segunda-feira, 22 de fevereiro de 2010 11:43