Dagger 2 构造函数注入等

Dagger 2 Constructor Injection and more

我有一些关于 dagger2 的问题,我觉得很难理解。此代码:

@Module
public class AppModule {

    private MainApplication applicationContext;

    @Inject
    public AppModule(MainApplication context){
        this.applicationContext = context;
    }

    @Provides
    @Singleton
    StuffA provideStuffA(){
        return new StuffA();
    }

    @Provides
    @Singleton
    StuffB provideStuffB(StuffA){
         return new StuffB(stuffA);
    }
}

并且在应用程序中class:

appComponent = DaggerAppComponent.builder()
                .appModule(new AppModule(this))
                .build();

我的第一个问题是:

第二个问题:

最后一题

PS。如果这真的是基本的东西,我很抱歉,但我发现文档很差,也缺乏示例。提前致谢

回答 1

您只需将它们分成两个单独的模块。 Dagger 将构建图表,当在某个点 provideStuffB() 被调用时,它将用 StuffA 注入它。顺便说一句,我认为 provide 方法中存在小语法错误,应该是(缺少 stuffA 参数):

@Provides
@Singleton
StuffB provideStuffB(StuffA stuffA){
     return new StuffB(stuffA);
}

回答2

是的,这是通常的方式。在您创建图形(在 onCreate() 中)之后,您将注入 this(应用程序)。请注意,在使用这种方法进行单元测试时有一个微妙的警告 - Application 对象甚至会在调用 setUp() 方法之前创建,因此你将无法 set/swap 你的测试组件(并且您将始终使用默认组件)。解决方案是使用图的惰性初始化,即当第一个 activity(或服务,或 BroadcastReceiver 等)调用 getApplication().getInjector(this) 时,您必须在该点创建图。

回答3

您通常有一个包含所有模块和子组件的 top Component。它(必须)能够注入所有活动。事实上,顶级组件用于生成图形。这是真实应用程序的示例:

@Component(modules = {IzgubenoDaggerModule.class,
                        AcraDaggerModule.class,
                        AppInfoDaggerModule.class,
                        SessionDaggerModule.class,
                        ComponentManagerDaggerModule.class,
                        NetworkInfoProviderDaggerModule.class,
                        DeviceInfoProviderDaggerModule.class,
                        KhRestExchangeManagerDaggerModule.class
                     })
@Singleton
public interface IzgubenoDaggerComponent extends GgLibDaggerComponent {
    void inject(IzgubenoApplication app);
    void inject(Act_Main act);
    void inject(Act_ContactDetails act);
    void inject(Act_MyPets act);
    void inject(Act_PetEdit act);
    void inject(Act_PetManage act);
    void inject(Act_PetPics act);
    //...
    GgLibDaggerComponent newGgLibDaggerComponent(HttpsDaggerModule httpsMod,
                                             KhRestDaggerModule khrestMod,
                                             AppInfoDaggerModule appInfoMod,
                                             GgServerDaggerModule ggServMod,
                                             GgClientDaggerModule ggClientMod);
    //...
}