Skip to content

Commit be5ae4d

Browse files
committed
dagger post updated
1 parent 01901ea commit be5ae4d

File tree

1 file changed

+17
-17
lines changed

1 file changed

+17
-17
lines changed

_drafts/2019-05-13-dagger.md

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ keywords: "dagger, wstrzykiwanie, zależności, moduł, komponent, podkomponent,
1111
---
1212

1313
## Wstęp
14-
Proces budowania większości aplikacji niezależnie od środowiska polega na tworzeniu różnego typu obiektów, które często wymagają innych zależności i nierzadko mogą być współdzielone. Ręczna inicjalizacja wszystkich zależności bywa kosztowna, czasochłonna oraz może zwiększać nadmiarowość powtarzającego się kodu. Wzorzec `Wstrzykiwanie zależności` (`Dependency Injection`) jest realizacją paradygmatu `Odwrócenia sterowania` (`Inversion of Control`) i przejmuje odpowiedzialność inicjalizowania obiektów poprzez wstrzykiwanie oczekiwanych zależności w odpowiednie miejsca. Na podstawie zdefiniowanych reguł `Dagger` dokonuje analizy zależności oraz generuje kod odpowiedzalny za wiązanie obiektów, a jego użycie opiera się wyłącznie na wykorzystaniu adnotacji i kontroli kompilacji w celu analizy i weryfikacji zależności. Dagger upraszcza dostęp do współużytkowanych instancji, ułatwia proces testowania i refaktoryzacji oraz jest prosty w konfiguracji.
14+
Proces budowania większości aplikacji niezależnie od środowiska polega na tworzeniu różnego typu obiektów, które często wymagają innych zależności i nierzadko mogą być współdzielone. Ręczna inicjalizacja wszystkich zależności bywa kosztowna, czasochłonna oraz może zwiększać nadmiarowość powtarzającego się kodu (`boilerplate`). Wzorzec `Wstrzykiwanie zależności` (`Dependency Injection`) jest realizacją paradygmatu `Odwrócenia sterowania` (`Inversion of Control`) i przejmuje odpowiedzialność inicjalizowania obiektów poprzez wstrzykiwanie oczekiwanych zależności w odpowiednie miejsca. Na podstawie zdefiniowanych komponentów i modułów `Dagger` dokonuje analizy zależności oraz generuje kod odpowiedzalny za wiązanie obiektów, a jego użycie opiera się wyłącznie na wykorzystaniu adnotacji i kontroli kompilacji w celu analizy i weryfikacji zależności. Dzięki temu proces testowania, refaktoryzacji i dostęp do współużytkowanych instancji jest uproszczony.
1515

1616
## Wstrzykiwanie
1717
Obiekt oznaczony adnotacją `@Inject` oczekuje inicjalizacji poprzez wstrzyknięcie zależności z poziomu komponentu. Jeśli kilka instancji tego samego typu ma zostać wstrzyknięte wówczas należy dokonać rozróżnienia za pomocą adnotacji `@Named` o wartości zgodnej z deklaracją w module. Istnieje także możliwość definicji własnego kwalifikatora przy użyciu adnotacji `@Qualifier` w definicji adnotacji.
@@ -197,6 +197,21 @@ public @interface UserScope {
197197
Rozszerzenie funckjonalności komponentu może zostać zrealizowane za pomocą wskazania zależności w postaci komponentu bazowego w komponencie pochodnym. Innymi słowy komponent rozszerzający jest swego rodzaju delegatem i poza modułami przyjmuje także zależność komponentu, który jest dla niego dostawcą. Komponent bazowy dostarcza `API` w postaci metod zwracających dany oczekiwany typ zależności (podobnie jak robi to moduł).
198198

199199
{% highlight java %}
200+
@Module
201+
public class UserModule {
202+
203+
private final UserActivity activity;
204+
205+
public UserModule(UserActivity activity) {
206+
this.activity = activity;
207+
}
208+
209+
@Provides @UserScope
210+
public UserManager providesUserDependency() {
211+
return new UserManager("global");
212+
}
213+
}
214+
200215
@UserScope
201216
@Component(dependencies = AppComponent.class, modules = UserModule.class)
202217
public interface UserComponent {
@@ -205,7 +220,7 @@ public interface UserComponent {
205220
}
206221

207222
@Singleton
208-
@Component(modules={AppModule.class, ManagerModule.class})
223+
@Component(modules = {AppModule.class, ManagerModule.class})
209224
public interface AppComponent {
210225

211226
//remove injection methods if child performs this and no need to use only base component
@@ -263,21 +278,6 @@ public class UserActivity extends AppCompatActivity {
263278
Rozwinięcie grafu drzewa może odbywać się przy użyciu podkomponentów, które rozszerzają zależności komponentu bazowego co sprawia, że komponenty te są ze sobą powiązane. Aby stworzyć komponent, który będzie podkomponentem należy oznaczyć go adnotacją `@Subcomponent`, dodać fabrykę w komponencie bazowym zwracającą podkomponent oraz dokonać inicjalizacji we właściwym zakresie.
264279

265280
{% highlight java %}
266-
@Module
267-
public class UserModule {
268-
269-
private final UserActivity activity;
270-
271-
public UserModule(UserActivity activity) {
272-
this.activity = activity;
273-
}
274-
275-
@Provides @UserScope
276-
public UserManager providesUserDependency() {
277-
return new UserManager("global");
278-
}
279-
}
280-
281281
@UserScope
282282
@Subcomponent(modules = UserModule.class)
283283
public interface UserComponent {

0 commit comments

Comments
 (0)