Я пытаюсь разбить мое приложение на несколько библиотек и использую 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.
Если кто-нибудь может мне помочь, я был бы очень признателен.