Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Tweeter tweeter = new Tweeter(); public TwitterApi()
{
//Добавляем класс в граф зависимостей
Injector.inject(this);
//На этом этапе "магическим" образом client проинициализирован Dagger'ом
}
TwitterApi невозможно будет использовать отдельно от контейнера DI.public class TwitterApi {
private final HttpClient client;
@Inject
public TwitterApi(HttpClient client) {
this.client = client;
}
...
}
new TwitterApi(mockClient), без всяких контейнеров. Использование контейнеров в модульных тестах, кстати, есть плохой тон.HttpClient'ов. И как быть, если эти объекты сами имеют внедряемые зависимости?public class TwitterApi {
private final Provider<HttpClient> clientProvider;
@Inject
public TwitterApi(Provider<HttpClient> clientProvider) {
this.clientProvider = clientProvider;
}
...
}
List<HttpClient> httpClients = new ArrayList<>();
for (int i = 0; i < 10; ++i) {
httpClients.add(clientProvider.get());
}
HttpClient помечен как singleton, то контейнер сам позаботится, чтобы существовал только один экземпляр объекта, и провайдер всегда будет возвращать его. Если scope не указан, объекты будут создаваться на каждый вызов get().Set или Map, что бывает полезно для плагинной архитектуры (расширение Multibindings). Не знаю, как с этим у Dagger, но Guice умеет всё вышеперечисленное, и это очень удобно.Injector.inject() рано или поздно прийдется сделать, потому что для кого-то TwitterApi будет полем, а при FieldInjection необходимо добавлять себя в контейнер.
TwitterApi внедряемым полем, и всё. Вы же контролируете ваш код, не так ли? :)Опыта с DI у меня немного, поэтому на подобные грабли не наступал (пока :) )
Знакомимся с Dependency Injection на примере Dagger