Prezados,
Estou trabalhando com o vraptor em um projeto ha alguns meses e a medida que o projeto cresceu surgiram alguns problemas de design.
No ínício percebi que havia as vezes em uma mesma request a injeção da mesma classe no controller e no dao, diante deste cenário, passamos a centralizar a injeção no dao, delegando ao controller o objeto do dao (sendo que o dao estaria injetado no controller).
Controller <- Dao <- OutraClasse
Na arquitetura todo modelo tem um dao, e se é necessário funcionalidades crud, tem um controller também, sempre usando generics pros daos e controllers.
Isto vem funcionando bem, mas como o projeto cresceu muito, começamos a ter referências cíclicas de injeção.
Uma coisa que fizemos é se um controller precisa acessar vários daos, o dao nativo do controller recebe os daos secundários (acho que este é o principal problema).
Andei pesquisando um pouco sobre princípios de dependencia acíclica, mas ainda sim estou um pouco confuso sobre o melhor design pro nosso projeto.
As perguntas são:
- Está correto injetar no dao de um determinado controlador os daos de outros modelos, assim podendo acessar seus métodos tanto no dao quanto no controller?
- Não estando correto, como fazer para que as diversas funcionalidades fiquem disponíveis tanto no dao, quanto no controller?
- Subempacotar os daos por funcionalidade e criar serviços de factory seria adequado (ex.: Criar uma factory que sirva diversos daos, e injetar a factory), e qual o melhor modelo?
- Como facilitar o teste dos controllers que possuem estas injeções dentro de classes injetadas? O exemplo da documentação não atende pra este caso, pois se fizer um mock de uma classe que recebe recursos injetados, não vai funcionar, teria que instanciar todas na mão.
O VRaptor facilitou muito o trampo neste projeto, mas agora, por usar indiscriminadamente injeções causou alguns problemas que queremos evitar daqui pra frente.
Sugestões são bem vindas.
PS.: Desculpe a quantidade de dúvidas num único post.