GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Acoplamento arquitetural usando DAOFactory/Service

Estou com dificuldades em tornar a arquitetura de um sistema mais flexível e desacoplada, vou dar uma breve descrição do projeto de software usado e do problema que estou tendo.

Como exemplo vou usar figurativamente o domínio “Produto” quando quero cadastrar o mesmo:

  1. O controller recebe o form na requisição, valida e converte o mesmo para um objeto de domínio;
  2. De posse do objeto de domínio, instancio a classe ProdutoService dentro do controller passando no construtor da ProdutoController a dependência DAOFactory;
  3. Chamo o método salvar da classe ProdutoService passando o objeto de domínio;
  4. No método salvar da classe ProdutoService instancio o ProdutoDAO por meio da DAOFactory;
  5. Chamo o método salvar da classe ProdutoDAO.

Minhas dúvidas:

  1. Ficar passando esse DAOFactory de dentro do Controller está me parecendo bem errado, tendo em vista que está criando um acoplamento no controller, e o correto seria a camada de serviço se comunicar com a camada da dados(DAO). Como resolvo isso?
  2. Está ficando muito complicado gerenciar todas as dependências de DAO usadas dentro da classe ProdutoService haja vista que não existe ferramenta de injeção de dependência no framework usado. Com o pattern Factory conseguiria resolver isso?
  3. Em um cenário real tenho uma classe Service que trata de vários objetos de domínio diferentes, o que gera uma quantidade ainda maior de dependência dos DAOs, neste caso não sei se fiz errado a classe Service ou se a solução proposta por mim no item 2 resolveria o problema.

Concordo. No seu caso, acho melhor deixar apenas a service conhecer alguma coisa de DAO.

Quais complicações vc está tendo?

Entendo que o DAOFactory é uma dependência do Service, por isso passo ele no construtor do Service(desacoplando para facilitar os mocks de teste), porém não vejo como passar ele como dependência pro Service sem ser por meio do controller. Tem alguma ideia de como fazer isso? Lembrado o que o DAOFactory é estático…

Digamos que minha ProdutoService trate de vários objetos de domínios que interagem entre si, Produto e Item por exemplo, e que exista um método vincularItemProduto…vou precisar do ProdutoDAO e ItemDAO para realizar este método…estava colocando todas estas dependências como atributos de ProdutoService, talvez fosse o correto deixar isto somente dentro do método que usará as chamadas aos DAOs.

ProdutoService {
  private DAOFactory daoFactory;
  private ProdutoDAO produtoDAO;
  private ItemDAO itemDAO;

  public void vincularItemProduto(Produto p, Item i) {
    this.produtoDAO = daoFactory.getProdutoDAO();
    this.itemDAO = daoFactory.getItemDAO();

    // lógica de negócio para vincular..depois persiste os registros
    produtoDAO.salvar(p);
    itemDAO.salvar(i);
  }
}

Como vc está criando uma instancia de um service no controller? Você está trabalhando com JBDC puro (objeto Connection) ?

Uso Hibernate, porém como disse não existe recurso de injeção de dependência…a única forma que vi de fazer essa ligação foi instanciando o service no controller.

ProdutoController {
  public void salvarProduto() {
    //instancia produto vindo do form
    new ProdutoService.salvar(produto);
  }
}

Uma forma bacana de fazer é usar uma factory para instanciar suas services. Com isso a factory ficaria responsavel por criar as services já passando no construtor as instancias dos DAOs.

Isso faria com que a responsabilidade de criar as instancias ficasse com a factory. Seria aplicado o conceito de IoC (Inversão de Controle).

Se precisar, faço um exemplo. Flws!

Exatamente isso que estou buscando, implementar IOC sem utilizar injeção de dependência, e uma das formas que tinha visto era manualmente por meio do padrão Factory.

Neste caso a chamada dos métodos da Factory ficaria dentro do controller, certo?

Isso. A factory ficaria responsável por criar as instancias das services, com isso, “injetando” as dependencias via construtor.

//