Sztylet jest sposobem łączenia wykresów obiektów i ich zależności. Alternatywnie do bezpośredniego wywoływania konstruktorów, uzyskujesz instancje, żądając ich od Sztyletu lub dostarczając obiekt, który chciałbyś wstrzyknąć z instancjami stworzonymi przez Sztylet.
Zróbmy kawiarnia, która zależy od Provider<Coffee>
i kasy CashRejestr. Załóżmy, że masz podłączone do modułu (być może do implementacji LightRoastCoffee i DefaultCashRegister).
public class CoffeeShop {
private final Provider<Coffee> coffeeProvider;
private final CashRegister register;
@Inject
public CoffeeShop(Provider<Coffee> coffeeProvider, CashRegister register) {
this.coffeeProvider = coffeeProvider;
this.register = register;
}
public void serve(Person person) {
cashRegister.takeMoneyFrom(person);
person.accept(coffeeProvider.get());
}
}
Teraz trzeba uzyskać wystąpienie tego CoffeeShop, ale ma tylko dwa parametry konstruktora i jego zależności. Jak to zrobić? Prosta: Mów Daggerowi, aby udostępnił fabryczną metodę w instancji składnika, którą generuje.
@Component(modules = {/* ... */})
public interface CoffeeShopComponent {
CoffeeShop getCoffeeShop();
void inject(CoffeeService serviceToInject); // to be discussed below
}
Po wywołaniu getCoffeeShop
, Dagger tworzy Provider<Coffee>
dostarczyć LightRoastCoffee, tworzy DefaultCashRegister, dostarcza je do konstruktora Coffeeshop i zwraca ci wynik. Gratulacje, jesteś dumnym właścicielem w pełni zmontowanej kawiarni.
Teraz to wszystko jest alternatywąvoid
metod iniekcyjnych, które odbywają się już utworzonej instancji i wprowadzić do niego:
public class CoffeeService extends SomeFrameworkService {
@Inject CoffeeShop coffeeShop;
@Override public void initialize() {
// Before injection, your coffeeShop field is null.
DaggerCoffeeShopComponent.create().inject(this);
// Dagger inspects CoffeeService at compile time, so at runtime it can reach
// in and set the fields.
}
@Override public void alternativeInitialize() {
// The above is equivalent to this, though:
coffeeShop = DaggerCoffeeShopComponent.create().getCoffeeShop();
}
}
Więc nie masz go: Dwa różne style, zarówno z których masz dostęp do w pełni wstrzykniętych wykresów obiektów bez wykazywania lub dbania o dokładnie te zależności, których potrzebują. Możesz preferować jedną lub drugą lub preferować metody fabryczne wtrysku najwyższego poziomu i wtrysku członków dla Androida lub Przypadki użycia usługi lub dowolny inny sposób łączenia i dopasowywania.
(. Uwaga: poza ich wykorzystania jako punkty wejścia do swojego obiektu wykresu, bez-Arg getters znane jako metod rezerw są także przydatne do wystawiania wiązania dla zależnościami składowych, jak David Rawson opisuje w other answer)
Powiązane: wyjaśnienie różnicy między komponentami i modułami http://stackoverflow.com/a/42616757/5241933 –