Eu vi vários argumentos contra o DAO ser chamado diretamente da classe Controller e também o DAO da classe Model.Infato Pessoalmente, sinto que, se estamos seguindo o padrão MVC, o controlador não deve ser associado ao DAO, mas à classe Model deve invocar o DAO de dentro e o controlador deve invocar a classe de modelo. Por que, podemos dissociar a classe de modelo de um aplicativo da Web e expor as funcionalidades de várias maneiras, como um serviço REST para usar nossa classe de modelo.
Se escrevermos a chamada DAO no controlador, não seria possível para um serviço REST reutilizar a funcionalidade, certo? Resumi as duas abordagens abaixo.
Abordagem # 1
public class CustomerController extends HttpServlet {
proctected void doPost(....) {
Customer customer = new Customer("xxxxx","23",1);
new CustomerDAO().save(customer);
}
}
Abordagem # 2
public class CustomerController extends HttpServlet {
proctected void doPost(....) {
Customer customer = new Customer("xxxxx","23",1);
customer.save(customer);
}
}
public class Customer {
...........
private void save(Customer customer){
new CustomerDAO().save(customer);
}
}
Nota -
Aqui está o que é uma definição de Model:
Modelo: O modelo gerencia o comportamento e os dados do domínio do aplicativo, responde a solicitações de informações sobre seu estado (geralmente da exibição) e responde às instruções para alterar o estado (geralmente do controlador).
Em sistemas orientados a eventos, o modelo notifica os observadores (geralmente visualizações) quando as informações são alteradas para que possam reagir.
Eu precisaria de uma opinião de especialistas sobre isso, porque acho que muitos usam o número 1 ou o número 2, então qual é?
Respostas:
Na minha opinião, você precisa distinguir entre o padrão MVC e a arquitetura de três camadas. Resumindo:
Arquitetura de três camadas:
O padrão MVC ocorre na camada de apresentação da arquitetura acima (para um aplicativo da web):
Ciclo de vida de uma solicitação HTTP típica :
fonte
Da camada do modelo.
Para ser mais preciso: dos serviços, que estão contidos na camada do modelo , porque eles governam a interação entre objetos de domínio e abstrações da lógica de armazenamento.
O controlador deve ser responsável apenas por alterar o estado da camada do modelo. DAOs fazem parte do mecanismo de persistência. Isso constitui uma parte da lógica de negócios e aplicativos do domínio. Se você começar a interagir com DAOs no controlador, estaria vazando a lógica do domínio na camada de apresentação .
fonte
Não sei ao certo o que o padrão MVC oficial exige, mas normalmente gosto de ter uma camada de "serviço" entre os controladores e os DAOs. O controlador extrai dados da solicitação e os passa para a classe de serviço apropriada. A classe de serviço é responsável por chamar um ou mais DAOs que retornam classes de modelo. Essas classes de modelo são então enviadas de volta ao controlador para serem enviadas para a camada de visualização. A inserção da camada de serviço ajuda na reutilização, pois vários controladores podem usar os mesmos métodos da camada de serviço.
fonte