Usuário com melhor resposta
Modelagem em camadas

Pergunta
-
Pessoal tenho a seguinte dúvida em modelagem em camadas, por favor me ajudem a entender o que tem que ter em cada camada dessas.
Camada de negócio?
No meu entender seria o os campos que se precisa tipo as classes com o atributos?
Camdas de Acesso a Dados?
No meu entender teria as rotinas de Cadastro,Alteração/Exclusão dos dados no banco de dados?
Camada de Apresentação?
Seria os formulários?
Atenciosamente
Respostas
-
Exemplo de uma situação:
Camada de dados
classeProduto.MetodoAtualizarQtdEstoqueProduto(parametroidProduto, parametroQtdASerAtualizada)
update estoque
set qtd = parametroQtdASerAtualizada
where idproduto = parametroidProduto
classeProduto.MetodoObterQtdEstoqueUltFechamento(parametroidProduto)
select qtd from estoque where campoidproduto = parametroidProduto
classeMovimento.MetodoObterQtdEstoqueSaida(parametroidProduto)
select sum(qtd) from movimentoestoque where campoidproduto = parametroidProduto and camposaidaestoque = 'S'
classeMovimento.MetodoObterQtdEstoqueEntrada(parametroidProduto)
select sum(qtd) from movimentoestoque where campoidproduto = parametroidProduto and camposaidaestoque = 'N'
ClasseMovimento.MetodoObterMovimentoDia(parametroApartirDe)
select idproduto from movimentoestoque where data >= parametroApartirDe
Camada de negocio
Classe Estoque.MetodoFecharEstoque(parametroAPartirDe)
produtosmovimentados= Camadadedados.ClasseMovimento.MetodoObterMovimentoDia(parametroAPartirDe)
loop produtosmovimentados
qtdestoqueultfechamento = classeProduto.MetodoObterQtdEstoqueUltFechamento(produtosmovimentados.idproduto)
qtdEstoqueAAtualizar = qtdestoqueultfechamento + classeMovimento.MetodoObterMovimentoDia(produtosmovimentados.idproduto)
qtdEstoqueAAtualizar = qtdestoqueultfechamento - classeMovimento.MetodoObterQtdEstqueSaida(produtosmovimentados.idproduto)
classeProduto.MetodoAtualizarQtdEstoqueProduto(produtosmovimentados.idproduto,qtdEstoqueAAtualizar)
fim loop
Botão da tela
Evento Click
CamadaNegocio.MetodoFecharEstoque('26/05/2008')
FIM Evento click
Claro que em uma situação real uma rotina de fechamento de caixa teria uma lógica melhorada visando performance porém o objetivo deste exemplo é entender o q vai em cada camada.
Esse exemplo é de uma programação simples de 3 camadas.
Em uma situação real o ideal seria adicionar uma UI que chamaria uma facade que chamaria a camada de negócio passando os dados por BusinessEntity. Mas assim ja da para fazer alguma coisa.
- Marcado como Resposta Wagner dos Santos VasconcellosModerator terça-feira, 29 de março de 2011 16:12
-
Olá.
Bom como já disseram, é complicado dizer o que é certo e o que é errado, tudo depende da sua necessidade. Existem alguns projetos que você pode analisar como o PetShop, tem um projeto em N-Camadas utilizando Linq que é muito bom, e também tem um documento da Microsoft de recomendação de arquitetura de N-Camadas para .Net.
Vou exemplificar o que eu gosto de utilizar, com uma breve explicação.
Camada Apresentação: Essa camada só possui os a parte dos webForms da sua aplicação web, ou winforms para windows. Como ela não possui nenhuma regra de negócio, só faz chamadas a camada de regra de negócios, eu posso trocar de windows para web por ex. sem ter que reescrever minha regra de negócios, só as chamadas mesmo.
Regra de Negócios: Essa aqui é o coração de tudo, faz validações mais complexas, solicita ou envia informações para a camada de acesso a dados, e também devolve algo para a Camada de Apresentação caso seja necessário.
Camada de acesso a dados: O único trabalho dessa camada é enviar ou pegar dados do banco de dados.
Um simples ex:
Na Camada de Apresentação:
Negocios.Salvar(int codigo, string nome);
Na Camada de Negócios:
if(codigo == 0)
Dados.Incluir(nome);
else
Dados.Alterar(codigo, nome);
// aqui eu poderia falar para salvar log das operações, antes de salvar ou incluir poderia fazer quantas validações fossem necessárias.
Na Camada de Acesso a Dados:
executa o comando necessário para incluir o alterar os dados no banco:
Espero ter ajudado, caso a resposta for útil marque para que outras pessoas possam achar a solução com mais facilidade.
Abraços.
- Marcado como Resposta Wagner dos Santos VasconcellosModerator terça-feira, 29 de março de 2011 16:12
-
Por exemplo:
Se vc tem que desenvolver um componente para um cliente que faça um calculo de seguros, seu componente
não vai ter formulários mas mesmo assim ele terá uma camada de apresentação com métodos e propriedades dos quais o desenvolvedor que utilizará o seu componente irá interagir.
Alexandre,No meu ponto de vista você está misturando as responsabilidades. Normalmente a Viewer se refere somente a aprensentação das informações.
Olhe o ASP.NET MVC Framework ou o Castle.MonoRail, basicamente os métodos que irão interagir com os modelos, nestes frameworks ficam na Controller. Pois assim separamos as responsabilidades deixando nossas aplicações flexíveis.
Basicamente é isto.
[]´s
- Marcado como Resposta Wagner dos Santos VasconcellosModerator terça-feira, 29 de março de 2011 16:12
-
http://forums.microsoft.com/MSDN-BR/ShowPost.aspx?PostID=3572098&SiteID=21
- Marcado como Resposta Wagner dos Santos VasconcellosModerator terça-feira, 29 de março de 2011 16:13
Todas as Respostas
-
Arquitetura não existe um jeito 100% certo de dizer aki faz assim aki faz assado.
Ao meu entender a camada de apresentação não precisa necessáriamente ser os formulários.
Por exemplo:
Se vc tem que desenvolver um componente para um cliente que faça um calculo de seguros, seu componente
não vai ter formulários mas mesmo assim ele terá uma camada de apresentação com métodos e propriedades dos quais o desenvolvedor que utilizará o seu componente irá interagir.
Na camada de dados são atribuídas funcionalidades que são somente para interação com o banco de dados, e na camada de negocios são atribuídas funcionalidades como calculos, chamadas de rotinas da camada de dados etc.
-
-
Exemplo de uma situação:
Camada de dados
classeProduto.MetodoAtualizarQtdEstoqueProduto(parametroidProduto, parametroQtdASerAtualizada)
update estoque
set qtd = parametroQtdASerAtualizada
where idproduto = parametroidProduto
classeProduto.MetodoObterQtdEstoqueUltFechamento(parametroidProduto)
select qtd from estoque where campoidproduto = parametroidProduto
classeMovimento.MetodoObterQtdEstoqueSaida(parametroidProduto)
select sum(qtd) from movimentoestoque where campoidproduto = parametroidProduto and camposaidaestoque = 'S'
classeMovimento.MetodoObterQtdEstoqueEntrada(parametroidProduto)
select sum(qtd) from movimentoestoque where campoidproduto = parametroidProduto and camposaidaestoque = 'N'
ClasseMovimento.MetodoObterMovimentoDia(parametroApartirDe)
select idproduto from movimentoestoque where data >= parametroApartirDe
Camada de negocio
Classe Estoque.MetodoFecharEstoque(parametroAPartirDe)
produtosmovimentados= Camadadedados.ClasseMovimento.MetodoObterMovimentoDia(parametroAPartirDe)
loop produtosmovimentados
qtdestoqueultfechamento = classeProduto.MetodoObterQtdEstoqueUltFechamento(produtosmovimentados.idproduto)
qtdEstoqueAAtualizar = qtdestoqueultfechamento + classeMovimento.MetodoObterMovimentoDia(produtosmovimentados.idproduto)
qtdEstoqueAAtualizar = qtdestoqueultfechamento - classeMovimento.MetodoObterQtdEstqueSaida(produtosmovimentados.idproduto)
classeProduto.MetodoAtualizarQtdEstoqueProduto(produtosmovimentados.idproduto,qtdEstoqueAAtualizar)
fim loop
Botão da tela
Evento Click
CamadaNegocio.MetodoFecharEstoque('26/05/2008')
FIM Evento click
Claro que em uma situação real uma rotina de fechamento de caixa teria uma lógica melhorada visando performance porém o objetivo deste exemplo é entender o q vai em cada camada.
Esse exemplo é de uma programação simples de 3 camadas.
Em uma situação real o ideal seria adicionar uma UI que chamaria uma facade que chamaria a camada de negócio passando os dados por BusinessEntity. Mas assim ja da para fazer alguma coisa.
- Marcado como Resposta Wagner dos Santos VasconcellosModerator terça-feira, 29 de março de 2011 16:12
-
Olá.
Bom como já disseram, é complicado dizer o que é certo e o que é errado, tudo depende da sua necessidade. Existem alguns projetos que você pode analisar como o PetShop, tem um projeto em N-Camadas utilizando Linq que é muito bom, e também tem um documento da Microsoft de recomendação de arquitetura de N-Camadas para .Net.
Vou exemplificar o que eu gosto de utilizar, com uma breve explicação.
Camada Apresentação: Essa camada só possui os a parte dos webForms da sua aplicação web, ou winforms para windows. Como ela não possui nenhuma regra de negócio, só faz chamadas a camada de regra de negócios, eu posso trocar de windows para web por ex. sem ter que reescrever minha regra de negócios, só as chamadas mesmo.
Regra de Negócios: Essa aqui é o coração de tudo, faz validações mais complexas, solicita ou envia informações para a camada de acesso a dados, e também devolve algo para a Camada de Apresentação caso seja necessário.
Camada de acesso a dados: O único trabalho dessa camada é enviar ou pegar dados do banco de dados.
Um simples ex:
Na Camada de Apresentação:
Negocios.Salvar(int codigo, string nome);
Na Camada de Negócios:
if(codigo == 0)
Dados.Incluir(nome);
else
Dados.Alterar(codigo, nome);
// aqui eu poderia falar para salvar log das operações, antes de salvar ou incluir poderia fazer quantas validações fossem necessárias.
Na Camada de Acesso a Dados:
executa o comando necessário para incluir o alterar os dados no banco:
Espero ter ajudado, caso a resposta for útil marque para que outras pessoas possam achar a solução com mais facilidade.
Abraços.
- Marcado como Resposta Wagner dos Santos VasconcellosModerator terça-feira, 29 de março de 2011 16:12
-
Por exemplo:
Se vc tem que desenvolver um componente para um cliente que faça um calculo de seguros, seu componente
não vai ter formulários mas mesmo assim ele terá uma camada de apresentação com métodos e propriedades dos quais o desenvolvedor que utilizará o seu componente irá interagir.
Alexandre,No meu ponto de vista você está misturando as responsabilidades. Normalmente a Viewer se refere somente a aprensentação das informações.
Olhe o ASP.NET MVC Framework ou o Castle.MonoRail, basicamente os métodos que irão interagir com os modelos, nestes frameworks ficam na Controller. Pois assim separamos as responsabilidades deixando nossas aplicações flexíveis.
Basicamente é isto.
[]´s
- Marcado como Resposta Wagner dos Santos VasconcellosModerator terça-feira, 29 de março de 2011 16:12
-
http://forums.microsoft.com/MSDN-BR/ShowPost.aspx?PostID=3572098&SiteID=21
- Marcado como Resposta Wagner dos Santos VasconcellosModerator terça-feira, 29 de março de 2011 16:13