Dagger 2:范围内提供 object 更新
Dagger 2: Update provided object in scope
示例方案:
它基于Mosby examples。我想在 @PerProject
范围内在 ProjectFragment
和 ProjectHistoryFragment
之间共享 Project
object。
项目模块:
@Module
public class ProjectModule {
private Project project;
public ProjectModule(Project project) {
this.project = project;
}
@Provides
@PerProject
public Project provideProject() {
return project;
}
}
ProjectModule
和 ProjectComponent
将由 ProjectFragment
创建并共享给每个 Project-dependent fragment
。不错
但是有个问题。如果我需要更新 Project
的标题怎么办?在我的例子中,Project
是一个最终的 object,没有任何 setter。 Project
只能在 ProjectFragment 中修改,因此我可以更新和重置 module's
值以供将来注入。但我认为这是不好的做法。有人可以提供更好的建议吗?
不要更改模块中的值。
一个组件(及其包含的模块)有一组对象,它们会在您需要的地方注入。它们被缓存、重用等等。 切换 对象会使您处于不一致的状态。
如果您需要更改一个对象,那么 创建一个带有新模块的新组件。
如果您仍然需要更改项目 object 而无需重新创建所有内容,则不要注入 Project
本身,而是注入一些 ProjectManager
,这还可以实现一些 Observable
模式,以便在 Project
发生变化时通知您。这样您就可以修改项目并对更改做出反应。
示例方案:
它基于Mosby examples。我想在 @PerProject
范围内在 ProjectFragment
和 ProjectHistoryFragment
之间共享 Project
object。
项目模块:
@Module
public class ProjectModule {
private Project project;
public ProjectModule(Project project) {
this.project = project;
}
@Provides
@PerProject
public Project provideProject() {
return project;
}
}
ProjectModule
和 ProjectComponent
将由 ProjectFragment
创建并共享给每个 Project-dependent fragment
。不错
但是有个问题。如果我需要更新 Project
的标题怎么办?在我的例子中,Project
是一个最终的 object,没有任何 setter。 Project
只能在 ProjectFragment 中修改,因此我可以更新和重置 module's
值以供将来注入。但我认为这是不好的做法。有人可以提供更好的建议吗?
不要更改模块中的值。
一个组件(及其包含的模块)有一组对象,它们会在您需要的地方注入。它们被缓存、重用等等。 切换 对象会使您处于不一致的状态。
如果您需要更改一个对象,那么 创建一个带有新模块的新组件。
如果您仍然需要更改项目 object 而无需重新创建所有内容,则不要注入 Project
本身,而是注入一些 ProjectManager
,这还可以实现一些 Observable
模式,以便在 Project
发生变化时通知您。这样您就可以修改项目并对更改做出反应。