Как добавить сгенерированную реализацию в Dagger Dependency Graph?

У меня есть интерфейс

public interface SomeInterface { 
  void test(); 
}

и процессор аннотаций, который генерирует реализацию SomeInterface, называемую SomeInterfaceImpl.

Чтобы сделать этот тип доступным с помощью инъекции зависимостей Dagger, я бы создал следующее:

@Component(modules = {ApplicationModule.class})
@Singleton
public interface ApplicationComponent {    
    SomeInterface getSomeInterface();       
}

а также

@Module
public class ApplicationModule {

    @Provides
    @Singleton
    SomeInterface provideSomeInterface() {
        return new SomeInterfaceImpl();
    }
}

Проблема в том, что я не могу использовать use SomeInterfaceImpl в моем ApplicationModule, потому что он еще не доступен и будет сгенерирован обработчиком аннотаций.

Как я могу расширить свой обработчик аннотаций, чтобы я мог использовать SomeInterfaceis, доступный для внедрения зависимостей Dagger, и чтобы сгенерированная реализация SomeInterfaceImpl была разрешена правильно?

Редактировать:

Пример работает, но я хочу создать ApplicationModule с другим процессором аннотаций и позволить процессору каким-то образом интегрировать ApplicationModule в граф кинжала. @Component (modules = {ApplicationModule.class}) не будет существовать, потому что я не знаю в коде, что ApplicationModule будет сгенерирован. Есть ли способ интегрировать сгенерированный класс @Module в Dagger Graph? Обратите внимание, что я не хочу предполагать, что ABCModule будет сгенерирован и добавлен в @Component. Я хочу, чтобы это происходило как-то автоматически.


person confile    schedule 07.04.2015    source источник
comment
Как получить реализацию, если не использовать кинжал? Это именно то, что вы должны делать в своем методе @Provides.   -  person deekay    schedule 13.04.2015
comment
@deekay SomeInterfaceImpl создается с помощью процессора аннотаций. ApplicationModule не создается.   -  person confile    schedule 13.04.2015


Ответы (1)


Пока аннотации находятся в одном и том же вызове javac, и пока вы в конечном итоге сгенерируете свой класс в одном из раундов процессора, Dagger должен отложить попытку использования символа до следующего раунда.

Однако в вашей конкретной ситуации, процитированной выше, процессор Dagger даже не будет пытаться получить доступ к SomeInterfaceImpl напрямую, потому что он находится в теле метода @Provides, а процессоры аннотаций не могут (через общедоступные API) получить доступ к содержимому тела метода. Таким образом, Dagger не должен даже заботиться о том, сгенерирован ли SomeInterfaceImpl вовремя или нет - но код, который генерирует Dagger, может не компилироваться (как и сам модуль), если вы не сгенерируете его до последнего раунда.

person Christian Gruber    schedule 09.04.2015
comment
Что посоветуете делать в этом случае? - person confile; 09.04.2015