Buscar..


Introducción

Dagger 2, como se explica en GitHub , es un enfoque de evolución en tiempo de compilación para la inyección de dependencia. Tomando el enfoque iniciado en Dagger 1.x hasta su conclusión final, Dagger 2.x elimina toda reflexión y mejora la claridad del código al eliminar el ObjectGraph / Injector tradicional en favor de las interfaces @Component especificadas @Component usuario.

Observaciones

  1. Configuración de la biblioteca en la aplicación (para proyectos maven, gradle, java)
  2. Ventajas del uso de Dragger
  3. Enlaces importantes (para documentación y demos)
  4. Cómo integrar y usar los componentes de Dragger

Dagger 2 API:

Daga 2 expone una serie de anotaciones especiales:

@Module para las clases cuyos métodos proporcionan dependencias

@Proporciona los métodos dentro de las clases de @Module

@Inyectar para solicitar una dependencia (un constructor, un campo o un método)

@Component es una interfaz puente entre módulos e inyección.

GitHub: https://github.com/google/dagger

UserGuide (Google): https://google.github.io/dagger/users-guide.html

Videos: https://google.github.io/dagger/resources.html

Tutorial de Vogella: http://www.vogella.com/tutorials/Dagger/article.html

Tutorial de Codepath: https://github.com/codepath/android_guides/wiki/Dependency-Injection-with-Dagger-2

Cree la clase @Module y la anotación @Singleton para el objeto

import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;

@Module
public class VehicleModule {
 
    @Provides @Singleton
    Motor provideMotor(){
        return new Motor();
    }
 
    @Provides @Singleton
    Vehicle provideVehicle(){
        return new Vehicle(new Motor());
    }
}

Cada proveedor (o método) debe tener la anotación @Provides y la clase debe tener la anotación @Module . La anotación @Singleton indica que solo habrá una instancia del objeto.

Solicitud de dependencias en objetos dependientes

Ahora que tiene los proveedores para sus diferentes modelos, debe solicitarlos. Al igual que el Vehicle necesita Motor , debe agregar la anotación @Inject en el constructor del Vehicle siguiente manera:

@Inject
public Vehicle(Motor motor){
    this.motor = motor;
}

Puede usar la anotación @Inject para solicitar dependencias en el constructor, los campos o los métodos. En este ejemplo, estoy manteniendo la inyección en el constructor.

Conectando @Modules con @Inject

La conexión entre el proveedor de dependencias, @Module y las clases que las solicitan a través de @Inject se realiza mediante @Component , que es una interfaz:

import javax.inject.Singleton;
import dagger.Component;

@Singleton
@Component(modules = {VehicleModule.class})
public interface VehicleComponent {
    Vehicle provideVehicle();
}

Para la anotación @Component , debe especificar qué módulos se van a utilizar. En este ejemplo, se utiliza VehicleModule , que se define en este ejemplo . Si necesita usar más módulos, simplemente agréguelos usando una coma como separador.

Usando la interfaz @Component para obtener objetos

Ahora que tiene todas las conexiones listas, debe obtener una instancia de esta interfaz e invocar sus métodos para obtener el objeto que necesita:

VehicleComponent component = Dagger_VehicleComponent.builder().vehicleModule(new VehicleModule()).build();
vehicle = component.provideVehicle();
Toast.makeText(this, String.valueOf(vehicle.getSpeed()), Toast.LENGTH_SHORT).show();

Cuando intenta crear un nuevo objeto de la interfaz con la anotación @Component , debe hacerlo utilizando el prefijo Dagger_<NameOfTheComponentInterface> , en este caso Dagger_VehicleComponent , y luego usar el método del generador para llamar a cada módulo interno.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow