[Logo] Mentawai Forum - Mentawai Web Framework
  [Search] Search   [Recent Topics] Recent Topics   [Members]  Member Listing   [Groups] Back to home page 
[Register] Register / 
[Login] Login 

Forum Read-Only! Check the new site and forum here!

14) Como usar o DI com objetos com composição?  XML
Forum Index -> F.A.Q.
Author Message
boaglio


[Avatar]

Joined: 28/09/2005 11:05:16
Messages: 299
Location: Sao Paulo - Brazil
Offline

Vamos começar com o típico ApplicationManager para usar Hibernate + Mentawai:

Code:
 public class ApplicationManager extends org.mentawai.core.ApplicationManager {
 
     public void init(Context context) {
 
         // sua implementação de NewsService...
         ioc("newsService", NewsServiceImpl.class);
 
         // sua implementação de NewsDao...
         ioc("newsDAO", HibernateNewsDAO.class); 
 
         // implementação de transaction para o Hibernate que já vem com o Mentawai...
         ioc("transaction", HibernateTransaction.class); 
     }
 
     public void loadActions() {
   
         // transformando mentawai num container de IoC...
         addGlobalFilter(new IoCFilter());
 
          // todas as actions terão uma session do Hibernate disponível através desse filtro...
          // true = transactional, ou seja, sempre que a session for aberta, uma transação do hibernate tb será aberta... 
          //(nada te impede de usar um TransactionFilter para melhor controlar essa transação do hibernate)...
         addGlobalFilter(new HibernateFilter(true));
 
          // tudo que precisar de uma session do hibernate vai recebe-la, no nosso caso aqui: HibernateTransaction e HiberanateNewsDAO... (famoso AUTO-WIRING)
         addGlobalFilter(new DIFilter("session", Session.class));
 
          // tudo que precisar de um NewsDAO, vai receber um NewsDAO. No nosso caso aqui será um HibernateNewsDAO (vide ioc acima) e provavelmente será injetado no nosso modelo de negócios...
         addGlobalFilter(new DIFilter("newsDAO", NewsDAO.class));
 
         // tudo que está no input da action será injetado na action (ou no model se action for model driven)...
         addGlobalFilter(new InjectionFilter());
 
         // tudo que está na action (ou no model se a action for model-driven) será colocado no output da action...
         addGlobalFilter(new OutputFilter());
 
         ActionConfig actionConfig = new ActionConfig("news", NewsAction.class);
         actionConfig.addConsequence(NewsAction.LIST_JSP, new Forward("/list.jsp"));
         actionConfig.addConsequence(NewsAction.LIST, new Redirect("news.mtw"));
         actionConfig.addConsequence(NewsAction.SHOW, new Forward("/update.jsp"));
         actionConfig.addFilter(new NewsValidationFilter(), "update");
         actionConfig.addFilter(new NewsValidationFilter(), "add");
         actionConfig.addConsequence(NewsAction.ERROR, "add", new Forward("add.jsp"));
         actionConfig.addConsequence(NewsAction.ERROR, "update", new Forward("update.jsp"));
         actionConfig.addFilter(new VOFilter("news", News.class));
         add(actionConfig);
     }
 
     public void loadLocales() {
 
         LocaleManager.add("en");
         LocaleManager.add("pt");
     }
 }


E o nosso VO:

Code:
public class News implements Serializable {
 	
 	private Long id;
 	private String title;
 	private String body;
 	private Date creationDate;


Nesse caso temos a classe News como VO que recebe os valores automaticamente preenchidos no formulário.

Injetados com DI temos a sessão do Hibernate e o newsDAO.

Até aí sem problemas... todos os dados do VO são preenchidos e trafegam da camada de visão (JSP) para a camada de persistência (Hibernate) sem problemas.

Mas se o nosso objeto News sofrer uma composição com outro objeto, por exemplo um User:

Code:
public class News implements Serializable {
 	
 	private Long id;
 	private String title;
 	private String body;
 	private Date creationDate;
         private User loggedUser;
 


Aí temos um problema, pois o o objeto filho loggedUser não será criado e injetado automaticamente pelo VOFilter do objeto pai News.

Para isso funcionar precisamos de outro VOFilter para o objeto filho e também de um DIFilter para injetar o objeto filho (dependencia) no objeto pai.

Code:
 // cria um novo VO para formar o objeto filho User...
 actionConfig.addFilter(new VOFilter("loggedUser", User.class));
 
 // quando o objeto pai News for requisitado, o DIFilter abaixo detectará a dependencia no objeto filho User e fará a composiçao, injetando o filho no pai...
 actionConfig.addFilter(new DIFilter("loggedUser", User.class); 
 


Com isso na sua aplicação os objetos serão ligados e você conseguirá persiti-los sem problemas através do Hibernate!


http://www.boaglio.com
[WWW]
 
Forum Index -> F.A.Q.
Go to:   
Powered by JForum 2.1.6 © JForum Team