Автоматическое связывание в Dagger, когда для каждого интерфейса существует одна реализация - PullRequest
0 голосов
/ 30 мая 2018

При использовании Dagger 2 очень часто я применяю следующий шаблон:

  1. Создайте интерфейс, назовем его LoginService
  2. Создайте только одну реализацию- LoginServiceImpl с инжектором конструктора:

    class LoginServiceImpl implements LoginService {
       @Inject LoginServiceImpl() {}
    }
    
  3. Привязать реализацию к интерфейсу:

    @Binds
    abstract LoginService bindStatisticsService(LoginServiceImpl impl);
    
  4. Всегда зависеть отинтерфейс - LoginService в этом случае.

Есть ли возможность избежать аннотированного метода @Binds?Есть ли более простой (с меньшим количеством шаблонного кода) способ сообщить Dagger - этот класс является единственной реализацией интерфейса, всегда связывайте его , например, в некоторой аннотации на самом интерфейсе?

Я прочитал документацию и, к сожалению, ничего подобного не нашел, но, возможно, кто-то знает какой-то трюк, который может решить мою проблему.

1 Ответ

0 голосов
/ 31 мая 2018

Я не думаю, что это возможно, даже гипотетически.

Кинжал не может сказать, что существует только одна реализация, и единственный способ, которым это могло бы быть, - это поиск каждого класса в (компиляции)classpath, чтобы попытаться найти все возможные варианты реализации.В лучшем случае это было бы медленно, но Java позволяет загружать классы из пользовательских загрузчиков классов, поэтому вам никогда не гарантируется получение полного списка доступных классов .Даже если бы вы утверждали, что Dagger должен просто соответствовать первому соответствующему присваиваемому типу, который он видит (потому что вы знаете, что он только один), у Dagger может не быть способа определить, где найти этот тип реализации.

В конечном итоге будет трудно улучшить однострочный оператор @Binds, который идентифицирует полностью определенный класс ключа привязки (your.package.name.LoginService) и цели (your.package.name.LoginServiceImpl).

...