Владимир Тагаков, независимый разработчик, рассказал про Dagger 2 — библиотеку от Google.
Он рассмотрел возможности современных решений Dependency Injection в Android-среде и продемонстрировал преимущества и недостатки подходов с использованием Depencency Injection.
6. public class Tweeter { public void tweet(String tweet) {
TwitterApi api = new TwitterApi();
api.postTweet("JakeWharton", tweet);
}
}
public class TwitterApi {
public void postTweet(String user, String tweet) {
OkHttpClient client = new OkHttpClient();
Request request = //...
client.newCall(request).execute();
} }
7. public class TwitterApi {
private final OkHttpClient client =
new OkHttpClient();
public void postTweet(String user, String tweet) {
Request request = //...
client.newCall(request).execute();
} }
8. public class TwitterApi {
private final OkHttpClient client =
new OkHttpClient();
public void postTweet(String user, String tweet) {
Request request = //...
client.newCall(request).execute();
} }
9. public class TwitterApi {
private final OkHttpClient client;
public TwitterApi(OkHttpClient client) { this.client
= client;
}
public void postTweet(String user, String tweet) {
Request request = //...
client.newCall(request).execute();
} }
10. public class Tweeter { public void tweet(String tweet) {
TwitterApi api = new TwitterApi();
api.postTweet("JakeWharton", tweet);
}
}
11. public class Tweeter { public void tweet(String tweet) {
TwitterApi api = new TwitterApi(
new OkHttpClient()
);
api.postTweet("JakeWharton", tweet);
}
}
12. public class Tweeter { public void tweet(String tweet) {
TwitterApi api = new TwitterApi(
new OkHttpClient()
);
api.postTweet("JakeWharton", tweet);
}
}
13. public class Tweeter { private final TwitterApi api =
new TwitterApi(new OkHttpClient());
public void tweet(String tweet) {
api.postTweet("JakeWharton", tweet);
}
}
14. public class Tweeter { private final TwitterApi api =
new TwitterApi(new OkHttpClient());
public void tweet(String tweet) {
api.postTweet("JakeWharton", tweet);
}
}
15. public class Tweeter { private final TwitterApi api =
new TwitterApi(new OkHttpClient());
public Tweeter(String user) { this.user = user; }
public void tweet(String tweet) { api.postTweet(user,
tweet);
}
}
16. Tweeter tweeter = new Tweeter("JakeWharton"); tweeter.tweet("Hello!");
17. Tweeter tweeter = new Tweeter("JakeWharton"); tweeter.tweet("Hello!");
Timeline timeline = new Timeline("JakeWharton"); timeline.loadMore(20);
for (Tweet tweet : timeline.get()) {
System.out.println(tweet); }
18. public class Timeline {
private final List<Tweet> cache =
new ArrayList<>();
private final TwitterApi api =
new TwitterApi(new OkHttpClient());
private final String user;
public Timeline(String user) { this.user = user;
}
public List<Tweet> get() { /* ... */ }
public void loadMore(int amount) { /* ... */ } }
19. public class Timeline {
private final List<Tweet> cache =
new ArrayList<>();
private final TwitterApi api;
private final String user;
public Timeline(TwitterApi api, String user) { this.user =
user;
this.api = api;
}
public List<Tweet> get() { /* ... */ }
public void loadMore(int amount) { /* ... */ } }
20. public class Timeline {
private final List<Tweet> cache =
new ArrayList<>();
private final TwitterApi api;
private final String user;
public Timeline(TwitterApi api, String user) { this.user =
user;
this.api = api;
}
public List<Tweet> get() { /* ... */ }
public void loadMore(int amount) { /* ... */ } }
21. public class Tweeter { private final TwitterApi api =
new TwitterApi(new OkHttpClient());
public Tweeter(String user) { this.user = user; }
public void tweet(String tweet) { api.postTweet(user,
tweet);
}
}
22. public class Tweeter { private final TwitterApi api;
public Tweeter(TwitterApi api, String user) { this.user =
user;
this.api = api; }
public void tweet(String tweet) { api.postTweet(user,
tweet);
}
}
23. public class Tweeter { private final TwitterApi api;
public Tweeter(TwitterApi api, String user) { this.user =
user;
this.api = api; }
public void tweet(String tweet) { api.postTweet(user,
tweet);
}
}
24. Tweeter tweeter = new Tweeter("JakeWharton"); tweeter.tweet("Hello!");
Timeline timeline = new Timeline("JakeWharton"); timeline.loadMore(20);
for (Tweet tweet : timeline.get()) {
System.out.println(tweet); }
25. OkHttpClient client = new OkHttpClient(); TwitterApi api = new
TwitterApi(client); String user = "Jake Wharton";
Tweeter tweeter = new Tweeter(api, user); tweeter.tweet("Hello!");
Timeline timeline = new Timeline(api, user); timeline.loadMore(20);
for (Tweet tweet : timeline.get()) {
System.out.println(tweet); }
26. OkHttpClient client = new OkHttpClient(); TwitterApi api = new
TwitterApi(client); String user = "Jake Wharton";
Tweeter tweeter = new Tweeter(api, user); tweeter.tweet("Hello!");
Timeline timeline = new Timeline(api, user); timeline.loadMore(20);
for (Tweet tweet : timeline.get()) { System.out.println(tweet); }
29. OkHttpClient client = new OkHttpClient(); TwitterApi api = new
TwitterApi(client); String user = "Jake Wharton";
Tweeter tweeter = new Tweeter(api, user); tweeter.tweet("Hello!");
Timeline timeline = new Timeline(api, user); timeline.loadMore(20);
for (Tweet tweet : timeline.get()) { System.out.println(tweet); }
Как избежать этого?
41. Injection в конструктор
Injection в поле
Injection в метод
Типы injection
42. @Inject на единственном конструкторе
Параметры конструктора – зависимости
Зависимости можно хранить в приватных
переменных
Неявно делает класс доступным для
последующего инжекта
Injection в конструктор
43. public class TwitterApplication { private final Tweeter tweeter;
private final Timeline timeline;
@Inject public TwitterApplication(Tweeter tweeter, Timeline
timeline) {
this.tweeter = tweeter; this.timeline =
timeline;
}
// ... }
44. @Module
public class NetworkModule { @Provides @Singleton
OkHttpClient provideOkHttpClient() { return new
OkHttpClient();
}
@Provides @Singleton
TwitterApi provideTwitterApi(OkHttpClient client) {
return new TwitterApi(client); } }
45. public class TwitterApi {
private final OkHttpClient client;
@Inject
public TwitterApi(OkHttpClient client) { this.client
= client;
}
public void postTweet(String user, String tweet) {
Request request = //...
client.newCall(request).execute();
} }
46. @Singleton
public class TwitterApi {
private final OkHttpClient client;
@Inject
public TwitterApi(OkHttpClient client) { this.client
= client;
}
public void postTweet(String user, String tweet) {
Request request = //...
client.newCall(request).execute();
} }
47. @Inject над каждой зависимостью
Поля не могут быть private или final
Объект ответственен за процесс инжекта
Единственный способ инъектить
зависимости в объекты созданием которых
управляем не мы
Injection в поле