首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匕首2结构体注射及更多

匕首2结构体注射及更多
EN

Stack Overflow用户
提问于 2015-07-13 13:20:44
回答 1查看 2.1K关注 0票数 1

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

代码语言:javascript
复制
@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);
    }
}

在申请课程中:

代码语言:javascript
复制
appComponent = DaggerAppComponent.builder()
                .appModule(new AppModule(this))
                .build();

我的第一个问题是:

  • 如果我想将模块分成2,provideStuffA in ModuleA,provideStuffB in ModuleB,那么考虑到B依赖于A,我如何才能做到这一点。

第二个问题:

  • 我有一个在Application类中使用的对象,它来自应用程序类,我称之为活动注入。那么如何在应用程序class=中访问该对象呢?我是否应该在上面的Dagger之后调用inject?

最后问题

  • 想象一下,我有两个模块,它们具有不同的依赖关系,我需要在相同的活动中使用它们。在同一活动中注入一个组件和不同模块的正确方法是什么。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-16 12:02:24

答案1

你只是把它们分成两个模块。匕首将构建图形,当某个时候调用provideStuffB()时,它将向它注入StuffA。顺便说一句,我认为provide方法中有小的语法错误,应该是(缺少stuffA参数):

代码语言:javascript
复制
@Provides
@Singleton
StuffB provideStuffB(StuffA stuffA){
     return new StuffB(stuffA);
}

答案2

是的,这是通常的方式。在创建图形(在onCreate()中)之后,就注入了this (应用程序)。请注意,在使用这种方法进行单元测试时,有一个微妙的警告--即使在调用Application方法之前,也会创建setUp()对象,因此您将无法设置/交换您的测试组件(并且您将始终使用默认组件)。解决方案是使用图形的延迟初始化,即当第一次活动(或服务,或BroadcastReceiver等)时。调用getApplication().getInjector(this)时,您必须在这一点上创建图形。

答案3

通常有一个包含所有模块和子组件的top Component。它必须能够注入所有的活动。事实上,顶部组件用于生成图形。下面是一个来自实际应用程序的例子:

代码语言:javascript
复制
@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);
    //...
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31384552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档