我正在开发一个Android应用程序并使用Dagger 2在我的活动/片段中注入一些对象作为单例。一些对象从数据库加载。匕首2:从数据库加载的注入对象
那么是否有可能在后台加载数据库对象,并尽快注入它?或者,如果我在通过匕首初始化单身人士时加载它,它是没有问题的?或者,我可以将引用传递给活动/片段并在那里加载对象。
你对这个问题的处理方法是什么?
我正在开发一个Android应用程序并使用Dagger 2在我的活动/片段中注入一些对象作为单例。一些对象从数据库加载。匕首2:从数据库加载的注入对象
那么是否有可能在后台加载数据库对象,并尽快注入它?或者,如果我在通过匕首初始化单身人士时加载它,它是没有问题的?或者,我可以将引用传递给活动/片段并在那里加载对象。
你对这个问题的处理方法是什么?
这是一个有趣的问题,因为它涉及上我认为是第一个问题很多人开始依赖注入(DI)将面临:什么类型的对象,我应该注入,我应该怎么新了,在你的情况下,我应该手动传递什么?
当您使用依赖注入(大概也是单元测试,但是这是一个不同的故事),重要的是你理解的对象类型/类你设计的分类是非常重要的:
注:这些都是我的这些术语的快速判读。如果您阅读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
......
这很难,无需了解更多的细节,给予进一步的建议你在做什么,但希望这能够回答你的问题:你必须将数据库中的实体从数据库中读取到需要的地方,你不应该在任何地方注入它。
我在数据库中存储例如用户会话,并希望以单例形式传递它。因为我已经有了某种“存储库”(它实际上在我的应用程序中被称为服务;)我将使用您的解决方案,而不是会话,在我的活动中注入存储库并从那里加载会话。 – SamVimes