数据库
首页 > 数据库> > dagger 2:注入从数据库加载的对象

dagger 2:注入从数据库加载的对象

作者:互联网

我正在开发一个Android应用程序,并使用Dagger 2在我的活动/片段中将一些对象作为单例注入.一些对象是从数据库加载的.

那么是否有可能在后台加载数据库对象并在可用时立即将其注入?还是在用匕首初始化单例时加载它没问题吗?或者,我可以将引用传递给活动/片段,然后将对象加载到那里.

您如何解决此问题?

解决方法:

这是一个有趣的问题,因为它涉及到我以为是从依赖注入(DI)开始的许多人所面临的第一个问题:我应该注入什么类型的对象,应该更新什么,以及在您的情况下应该怎样?我手动绕过吗?

当您使用依赖项注入(大概还进行单元测试,但这是不同的话)时,了解所设计的对象/类的类型的分类很重要:

>服务:执行某些操作的对象,例如业务逻辑.

>这些是您希望在单元测试中达到mock的东西.

>值对象(在我们的讨论中,还包括DTOs和Entities ..认为POCO或POJO):这些是保存信息的对象.通常是不可变的模型对象.值对象对服务没有任何依赖性,即,您永远不想在其中注入任何东西.

>您绝不会在单元测试中嘲笑这类对象!您使用具体类型,理想情况下使用Test Data Builders来创建它们.

注意:这些是我对这些术语的快速解释.如果您阅读有关Domain Driven Design的书,则会发现更精确的定义,但我认为这足以讨论DI.

Misko Hevery(AngularJS之父; ;-)提到这些术语(如“服务”)被重载,尤其是在Android中,其中“服务”具有特定含义,因此他分别将值对象和服务称为可更新对象和可注入对象.我认为这是个好建议.

要将这些概念应用于您的案例:您将拥有一些类,可以在数据库中查询相关对象.

假设您正在谈论的对象是Student,并且其中可能包含一些不可变的字段,例如:

class Student {
    public final long id;
    public final String firstName;
    public final String lastName;
    public final String email;

    public Student(...) {
        // assignment of fields here...
    }
}

然后,您将拥有一些对象,该对象从数据库中查询学生条目,让我们在这里说出类似StudentRepository的内容:

class StudentRepository {
    public List<Student> findAll() {
        // db access here...
    }
}

在此示例中,Student是值对象(可更新),StudentRepository是服务(可注入).

在您的代码中,您只想使用Dagger注入StudentRepository,但是您绝不会注入Student …

在不知道有关您正在做的事情的更多细节的情况下很难提供进一步的建议,但是希望这可以回答您的问题:您必须将从数据库读取的数据库实体传递到需要的任何地方,您不必注入它任何地方.

标签:dagger-2,singleton,android,database
来源: https://codeday.me/bug/20191028/1949400.html