首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Dagger 2到Android Dagger 2.11的端口

从Dagger 2到Android Dagger 2.11的端口
EN

Stack Overflow用户
提问于 2017-06-28 16:07:35
回答 5查看 706关注 0票数 2

在将代码从Dagger 2移植到Android Dagger 2.11时,我不知道如何设置一些东西。在Dagger 2中,设置是这样的:

代码语言:javascript
复制
public class App extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        this.initializeInjector();
    }

    private void initializeInjector() {

        //this class should be auto-generated by Dagger on build
        this.applicationComponent = DaggerApplicationComponent.builder()
                .applicationModule(new ApplicationModule(this))
                .netModule(new NetModule())
                .build();
    }

    public ApplicationComponent getApplicationComponent() {
        return this.applicationComponent;
    }
}

然后,您可以访问applicationComponent,并且可以使用以下命令注入任何对象:

getApplicationComponent().inject(MyCustomObject);

在Android Dagger 2.11中,你不再这样做了。对于活动和片段,可以使用AndroidInjector.inject()方法注入,但是其他类型呢?让我们看一下下面的例子。我们有一个可以发布工作的JobManager。作业被持久化到一个文件中,当它们应该被发布时,它们首先被反序列化。问题是,它的依赖关系当然没有设置。所以问题是:如何做到这一点?

代码语言:javascript
复制
public class JobManager {

    private Context context;

    @Inject
    public JobManager(Context context) {
        this.context = context;
    }

    public void postJob(String jobId) {

        MyJob myJob = deserializePersistedJobFromFile(jobId);


        //((App) context).getApplicationComponent().inject(myJob); //This was the old way of doing injection
        AndroidInjector.inject(myJob); //This doesn't work - what to do now?

    }

    .
    .
    .

}

public class MyJob {

    @Inject
    ApiService apiService;

    .
    .
    .
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-06-28 19:41:18

您可以让Dagger注入一个MembersInjector,然后使用它将依赖项注入到您自己的对象中……

代码语言:javascript
复制
public class JobManager {

    private Context context;

    @Inject
    public JobManager(Context context, MembersInjector<MyJob> jobInjector) {
        this.context = context;
    }

    public void postJob(String jobId) {

        MyJob myJob = deserializePersistedJobFromFile(jobId);
        jobInjector.inject(myJob);
    }

    .
    .
    .

}
票数 2
EN

Stack Overflow用户

发布于 2017-06-28 16:49:09

你在使用“旧”方法时有没有遇到什么问题,让你想要换成“新”方法?

在使用静态AndroidInjector类执行依赖注入时,我找不到一个真正的优点,但它确实增加了代码的复杂性。

因此,如果您没有非常明确的理由朝这个方向发展,我建议您继续使用“旧的”工作方法。

至于注入到非活动/片段类中,我认为你不应该使用依赖注入框架。仅将Dagger用于注入到应用程序、活动、片段和服务中。更多信息可以在这篇文章中找到:Dependency Injection in Android

票数 1
EN

Stack Overflow用户

发布于 2017-06-28 16:43:56

在手机上写下这篇文章,所以对于任何打字错误,我深表歉意。

MyJob需要一个接受ApiService的@Inject(ed)构造函数,而不是成员注入,这不是很有意义吗?为什么MyJob不能有自己的构造函数?(不熟悉这是不是Android SDK类)。如果这不是答案,那么我有另一个观察结果,那就是你的JobManager似乎做了JobScheduler做的事情?除非它仅仅是一个术语的混淆(即两个“工作”)

除了Android和它的生命周期,唯一性,依赖反转最常见的用途是构造函数注入。学习Android框架中的依赖注入模式并不是最好的介绍,你会被“对编译器撒谎”的依赖注入框架功能所吸引,该功能只是为了帮助移出遗留的代码库(c.f。Dagger 1的静态注入或Guide的“私有”成员注入)。

顺便说一句,我避免使用"Android Dagger“,因为它似乎与模块化的代码分离背道而驰。我认为我在这里还有更多的东西要学,但现在"Android Dagger“的样板干扰优势被我对松散耦合的功能模块的需求所抵消,以支持Instant Apps和一个完全更模块化的代码库。

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44796932

复制
相关文章

相似问题

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