Começando mais um post para a série sobre RoboGuice, se você não viu os posts anteriores, sugiro que confira em: https://www.redspark.io/?p=6325 e https://www.redspark.io/?p=6341.
Neste post eu demonstrarei como realizar injeção de dependência de uma interface com diversas implementações, utilizando o RoboGuice.
Primeiro, vamos definir nosso cenário:
Temos uma interface chamada IMyService e duas implementações, chamadas NewService e OldService. Se a nossa Activity estiver da seguinte forma:
[cc lang=”java”]
package br.com.;
import roboguice.activity.RoboActivity;
import roboguice.inject.ContentView;
import roboguice.inject.InjectView;
import android.os.Bundle;
import android.widget.TextView;
import br.com..service.IMyService;
import com.google.inject.Inject;
@ContentView(R.layout.main)
public class HelloAndroidActivity extends RoboActivity {
@Inject
private IMyService service;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
[/cc]
Como o RoboGuice saberá qual implementação utilizar ? NÃO saberá!
Para resolver este problema, temos diversas opções. Neste post citarei algumas, que envolvem a criação de uma classe de configuração para o RoboGuice, extendendo AbstractModule.
Primeiramente, devemos criar um xml em res/values/ com o nome de roboguice.xml para explicitar quais nossas classes realizarão a configuração dos módulos do RoboGuice:
[cc lang=”xml”]
[/cc]
No exemplo, a minha classe que configura os módulos do RoboGuice é MyModules e fica em br.com..configurations. Você deve alterar para o caminho que represente a sua classe e, se quiser, adicionar outras, duplicando a tag “
A minha classe de configuração, está atualmente da seguinte forma:
[cc lang=”java”]
package br.com..configurations;
import br.com..service.IMyService;
import br.com..service.impl.MyNEWService;
import com.google.inject.AbstractModule;
/**
* @author lucas.oliveira
*
*/
public class MyModules extends AbstractModule {
/*
* (non-Javadoc)
*
* @see com.google.inject.AbstractModule#configure()
*/
@Override
protected void configure() {
bind(IMyService.class).to(NewService.class);
}
}
[/cc]
Desta forma, todas as injeções de dependência para IMyService, serão implementadas com NewService. Outra forma de fazer isto, é utilizando a anotação @ImplementedBy em IMyService, como segue no exemplo:
[cc lang=”java”]
package br.com..service;
import br.com..service.impl.MyNEWService;
import com.google.inject.ImplementedBy;
/**
* @author lucas.oliveira
*
*/
@ImplementedBy(MyNEWService.class)
public interface IMyService {
// declaração dos métodos
}
[/cc]
O único problema deste novo método, talvez seja a manutenção de código, já que estas anotações poderão ficar espalhadas por todo o projeto. Mas fica a cargo do desenvolvedor dizer qual método lhe é mais conveniente.
Com este último exemplo, eu encerro este post. Aguardem por novos posts sobre o RoboGuice!
Este foi mais um post da série Android, espero que tenham gostado. Quaisquer dúvidas, sugestões e/ou reclamações, comentem!
_________________________________________
Lucas Oliveira – Analista Programador na redspark.
Bacharel em Sistemas de Informação pela Universidade de São Paulo.
@OliveiraLima_