在多个Android模块之间共享1个依赖项实例

在多个Android模块之间共享1个依赖项实例,android,dagger-2,Android,Dagger 2,我正试图将我的应用程序分解成多个库,并利用Dagger2注入依赖项。首先,我将应用程序分为两个Android模块。登录发生在应用程序模块中,其他所有内容都在核心库中 应用程序结构当前如下所示: Android Application ├── App Module (Only has login) | └── Core Library ├── Core Library | └── Networking library └── Cert Pinning Library └── Net

我正试图将我的应用程序分解成多个库,并利用Dagger2注入依赖项。首先,我将应用程序分为两个Android模块。登录发生在应用程序模块中,其他所有内容都在核心库中

应用程序结构当前如下所示:

Android Application
├── App Module (Only has login)
|   └── Core Library
├── Core Library
|   └── Networking library
    └── Cert Pinning Library
└── Networking Library
└── Cert Pinning Library
   //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
 }
 }
@Component(modules = { AppModule.class }, dependencies = { CoreComponent.class }) @Singleton public interface AppComponent {
我想在应用程序模块和核心库之间共享网络库和证书固定库的相同实例

我的匕首文件如下所示:

Android Application
├── App Module (Only has login)
|   └── Core Library
├── Core Library
|   └── Networking library
    └── Cert Pinning Library
└── Networking Library
└── Cert Pinning Library
   //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
 }
 }
@Component(modules = { AppModule.class }, dependencies = { CoreComponent.class }) @Singleton public interface AppComponent {
目前,此代码可以编译,但应用程序模块和核心库使用NetworkingModule和CertificatePanerModule的不同实例。我尝试将AppComponent修改为如下所示:

Android Application
├── App Module (Only has login)
|   └── Core Library
├── Core Library
|   └── Networking library
    └── Cert Pinning Library
└── Networking Library
└── Cert Pinning Library
   //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
 }
 }
@Component(modules = { AppModule.class }, dependencies = { CoreComponent.class }) @Singleton public interface AppComponent {
但由于应用程序模块无法看到CoreModule中定义的提供者,因此无法编译


如果有人能帮助我,我将不胜感激。

我认为您应该为每个范围安装一个组件,而不是每个。。。“图书馆”之类的。库应该公开模块。虽然我想知道你如何确保他们的范围。谢谢你的答复。我想我明白你的意思。我将尝试使用作用域组件,看看能否让它正常工作。顺便说一句,这里有一些关于使用dagger的多模块gradle项目的帖子。如果你稍微搜索一下,你可能会找到一个。我认为您必须将组件从根模块传递到其他模块或要共享的绑定实例