Mobile

Android – Injeção de dependência com RoboGuice (Parte 3)

 

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”]



br.com..configurations.MyModules


[/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_

 

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Compartilhe isso: