Поделиться 1 экземпляром зависимостей между несколькими модулями Android - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь разбить мое приложение на несколько библиотек и использую Dagger2 для внедрения зависимостей. Для начала я разбил приложение на 2 модуля Android. Вход в систему происходит в модуле App, а все остальное - в библиотеке Core.

Структура приложения в настоящее время выглядит следующим образом:

Android Application
├── App Module (Only has login)
|   └── Core Library
├── Core Library
|   └── Networking library
    └── Cert Pinning Library
└── Networking Library
└── Cert Pinning Library

Я хочу использовать один и тот же экземпляр сетевой библиотеки и библиотеки закрепления сертификатов между модулем App и библиотекой Core.

Мои файлы Dagger выглядят так:

   //AppComponent
   @Component(modules = { AppModule.class, CoreModule.class CertificatePinnerModule.class, NetworkingModule.class}) @Singleton public interface AppComponent {
     void inject(LoginActivity loginActivity);
     }

    //AppModule
     @Module public class AppModule {}

    //CoreComponent
    @Component(modules = {
        CoreModule.class CertificatePinnerModule.class, NetworkingModule.class
    })        
    @Singleton public interface CoreComponent {
    //a bunch of injection locations
    }


    //CoreModule
    @Module public class CoreModule {}

    //CertPinnerModule
    @Module public class CertificatePinnerModule {}

    //NetworkingModule
    @Module public class NetworkingModule {}

    //NetworkingSupportComponent
    @Component(modules = {NetworkingModule.class,     
    CertificatePinnerModule.class}) @Singleton
    public interface NetworkingSupportComponent {

    }

    //Application class
    public class Application extends Application {  
      private AppComponent component;  

      @Override public void onCreate() {
        super.onCreate();
     CoreModule coreModule = new CoreModule(this);
        CoreInjector.init(coreModule); //DaggerCoreComponent builder
    component = DaggerAppComponent.builder().coreModule(coreModule).appModule(getAppModule()).build();
    NetworkingSupport.init(this); //DaggerNetworkingSupportComponent builder
 }
 }

В настоящее время этот код компилируется, но модуль App и библиотека Core используют разные экземпляры NetworkingModule и CertificatePinnerModule. Я попытался изменить AppComponent, чтобы он выглядел так:

@Component(modules = { AppModule.class }, dependencies = { CoreComponent.class }) @Singleton public interface AppComponent {

, но это не компилируется, поскольку модуль приложения не может видеть поставщиков, определенных в CoreModule.

Если кто-нибудь может мне помочь, я был бы очень признателен.

...