Imaginem que você esta utilizando algum framework web moderno que trabalha com Pojo e coloca na sua “action” um pojo preenchido com os dados da request.
Ao mesmo tempo você esta utilizando domain driven design e algum framework parrudo de IoC\DI com o Spring.
Usando DDD, você normalmente não tera coisas como noticiaService.publica(noticia) e sim noticia.publica().
No exemplo da noticia, teriamos um código mais ou menos assim:
public Class Noticia {
//...
public void publicar() {
// um monte de regras de negocio
this.status = NoticiaStatus.PUBLICADO;
// um monte de regras de negocio
noticiaRepository.update(this);
notificacaoPublicacaoService.notificaPublicacaoNoticia(this); // manda um SMS pro diretor do jornal
// um monte de regras de negocio
}
}
Noticia é um entity, noticiaRepository é uma interface de um Repository e notificacaoPublicacaoService é uma interface para um Service (ok, não é o melhor exemplo de service).
Usando um container DI\IoC, como o Spring, eu deixaria a instanciação do noticiaRepository e do notificacaoPublicacaoService gerenciadas pelo container IoC\DI (usando o Spring eu posso inclusive cuidar de integração com JPA e outras coisas).
Neste caso, notificacaoPublicacaoService e noticiaRepository são invariantes do objeto noticia, ou seja, para utilizar o objeto noticia eu preciso que esses caras estejam instanciados e “setados” no objeto noticia.
A questão é, como estou usando um framework web moderno baseado em Pojo, o objeto noticia é instanciado pelo framework web. Qual a melhor maneira de injetar as invariantes gerenciadas pelo container IoC\DI nas entities?
Algumas opções, boas e “não tão boas”:
- No construtor da Entity chamar a API do container IoC\DI para preencher as invariantes
public Noticia() {
this.noticaRepository = ApplicationContext.getApplicationContextDeAlgumLugar().getBean("noticiaRepository");
this.notificacaoPublicacaoService= ApplicationContext.getApplicationContextDeAlgumLugar().getBean("notificacaoPublicacaoService");
}
- Fazer a Entity ser gerenciada pelo container IoC\DI e deixar que ele preencha as invariantes e fazer algum gato no framework web para este usar a Entity gerenciada pelo container IoC\DI:
<bean class="example.Noticia">
<property name="noticiaRepository">
<ref bean="noticiaRepository"/>
</property>
</bean>
<!-- ok, posso usar autowire, annotations, etc -->
O que vocês tem usado? Alguém já fez isso com JSF+Spring? Recomendam algum outro framework?