21 ago 2012

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: http://www.redspark.io/?p=6325 e http://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:
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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);
    }

}

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:
 

1
2
3
4
5
6
<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <string-array name="roboguice_modules">
        <item>br.com..configurations.MyModules</item>
    </string-array>
</resources>

 
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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);
    }

}

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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

}

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_

 

Leave a Comment