2015-07-28 61 views
3

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

那么是否有可能在后台加载数据库对象,并尽快注入它?或者,如果我在通过匕首初始化单身人士时加载它,它是没有问题的?或者,我可以将引用传递给活动/片段并在那里加载对象。

你对这个问题的处理方法是什么?

回答

4

这是一个有趣的问题,因为它涉及上我认为是第一个问题很多人开始依赖注入(DI)将面临:什么类型的对象,我应该注入,我应该怎么了,在你的情况下,我应该手动传递什么?

当您使用依赖注入(大概也是单元测试,但是这是一个不同的故事),重要的是你理解的对象类型/类你设计的分类是非常重要的:

  1. 服务:执行某些操作的对象,如业务逻辑。
    • 这些是单元测试中你想要的mock的事情。
  2. 值对象(为了我们的讨论,还包括DTOs和实体..认为POCO或POJO):这些是持有信息的对象。通常是不可变的模型对象。价值对象对服务没有任何依赖性,即你永远不想向它们注入任何东西。
    • 你绝不会在单元测试中嘲笑这类对象!您可以使用具体类型,最好使用Test Data Builders来创建它们。

注:这些都是我的这些术语的快速判读。如果您阅读Domain Driven Design的书籍,您会发现更精确的定义,但我认为这应该足以达到讨论DI的目的。

Misko Hevery(的AngularJS ;-)父亲提到这些术语,如“服务”超负荷,尤其是在Android中,其中“服务”有特定的含义,于是,他把价值对象和服务Newables注射剂分别为。我认为这是很好的建议。

要将这些概念应用于您的案例:您需要一些查询数据库的类以查找有问题的对象。

比方说,你在谈论的对象是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... 
    } 
} 

然后你就会有一些对象,从数据库中查询Student条目,让我们说这句话StudentRepository这里:

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

在这个例子中,Student是一个值对象(newable)和StudentRepository是服务(注射用)。

在代码中,你只需要使用匕首注入StudentRepository - 但你最好从未注入Student ......

这很难,无需了解更多的细节,给予进一步的建议你在做什么,但希望这能够回答你的问题:你必须将数据库中的实体从数据库中读取到需要的地方,你不应该在任何地方注入它。

+0

我在数据库中存储例如用户会话,并希望以单例形式传递它。因为我已经有了某种“存储库”(它实际上在我的应用程序中被称为服务;)我将使用您的解决方案,而不是会话,在我的活动中注入存储库并从那里加载会话。 – SamVimes