Szukaj…


Wprowadzenie

Sztylet 2, jak wyjaśniono na GitHub , jest podejściem ewolucyjnym do wstrzykiwania zależności w czasie kompilacji. Przyjmując podejście rozpoczęte w Dagger 1.x do ostatecznego wniosku, Dagger 2.x eliminuje wszelkie odbicia i poprawia przejrzystość kodu poprzez usunięcie tradycyjnego ObjectGraph / Injector na rzecz określonych przez @Component interfejsów @Component .

Uwagi

  1. Konfiguracja biblioteki w aplikacji (dla projektów maven, gradle, java)
  2. Zalety korzystania z Draggera
  3. Ważne linki (do dokumentacji i wersji demonstracyjnych)
  4. Jak zintegrować i używać składników Draggera

Interfejs API Dagger 2:

Sztylet 2 pokazuje szereg specjalnych adnotacji:

@Moduł dla klas, których metody zapewniają zależności

@Provides dla metod w klasach @Module

@ Wstrzyknąć, aby zażądać zależności (konstruktor, pole lub metoda)

@Component to interfejs pomostowy między modułami a aplikacją

Ważne linki:

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

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

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

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

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

Utwórz adnotację @Module Class i @Singleton dla Object

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());
    }
}

Każdy dostawca (lub metody) musi mieć @Provides adnotacji i klasa musi mieć @Module adnotacji. Adnotacja @Singleton wskazuje, że będzie tylko jedna instancja obiektu.

Żądanie zależności w obiektach zależnych

Teraz, gdy masz dostawców różnych modeli, musisz o nie poprosić. Tak jak Vehicle potrzebuje Motor , musisz dodać adnotację @Inject w konstruktorze Vehicle w następujący sposób:

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

Za pomocą adnotacji @Inject można żądać zależności w konstruktorze, polach lub metodach. W tym przykładzie trzymam zastrzyk w konstruktorze.

Łączenie @modułów z @Inject

Połączenie między dostawcą zależności @Module a klasami żądającymi ich za pośrednictwem @Inject odbywa się za pomocą @Component , który jest interfejsem:

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

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

Aby @Component adnotację @Component , musisz określić, które moduły będą używane. W tym przykładzie VehicleModule , który jest zdefiniowany w tym przykładzie . Jeśli potrzebujesz użyć więcej modułów, po prostu dodaj je, używając przecinka jako separatora.

Używanie interfejsu @Component do uzyskiwania obiektów

Teraz, gdy masz gotowe wszystkie połączenia, musisz uzyskać instancję tego interfejsu i wywołać jego metody w celu uzyskania potrzebnego obiektu:

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

Kiedy próbujesz utworzyć nowy obiekt interfejsu z adnotacją @Component , musisz to zrobić, używając przedrostka Dagger_<NameOfTheComponentInterface> , w tym przypadku Dagger_VehicleComponent , a następnie użyj metody konstruktora, aby wywołać każdy moduł wewnątrz.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow