Android
Library Dagger 2: Wstrzykiwanie zależności w aplikacjach
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
- Konfiguracja biblioteki w aplikacji (dla projektów maven, gradle, java)
- Zalety korzystania z Draggera
- Ważne linki (do dokumentacji i wersji demonstracyjnych)
- 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.