我可能错过了一些东西,但我认为像@Singleton这样的作用域用于定义“作用域生命周期”。
我在Android应用程序中使用了Dagger 2(但我认为问题根本与android相关)。
我有1个模块:
@Module public class MailModule {
@Singleton @Provides public AccountManager providesAccountManager() {
return new AccountManager();
}
@Singleton @Provides public MailProvider providesMailProvider(AccountManager accountManager) {
return new MailProvider(accountManager);
}
}
我有两个与@Singleton
范围不同的组件:
@Singleton
@Component(modules = MailModule.class)
public interface LoginComponent {
public LoginPresenter presenter();
}
@Singleton
@Component(
modules = MailModule.class
)
public interface MenuComponent {
MenuPresenter presenter();
}
两者,MenuPresenter
并且LoginPresenter
,有一个@Inject
构造函数。虽然MenuPresenter期望将其MailProvider
作为参数,但LoginPresenter却采用了AccountManager
:
@Inject public MenuPresenter(MailProvider mailProvider) { ... }
@Inject public LoginPresenter(AccountManager accountManager) { ... }
但是每次我使用这些组件创建一个MenuPresenter
或时LoginPresenter
,都会得到MailProvider
and的新实例AccountManager
。我认为它们在同一范围内,因此应该是单例(在同一范围内)。
我了解完全错误的事情吗?如何为匕首2中的多个组件定义一个真正的单例?
我假设LoginComponent
和MenuComponent
分别使用,例如LoginActivity
和中MenuActivity
。每个组件都是内置的Activity.onCreate
。如果是这样,则每次创建新活动,模块和依赖项时,都会重新创建组件,而与它们绑定的范围无关。因此,你得到的新情况MainProvider
和AccountManager
每一次。
MenuActivity
并且LoginActivity
具有单独的生命周期,因此MailModule
两者的依赖关系不能都是单例的。你需要的是申报根组件与@Singleton
范围(例如,在应用程序子类),化妆MenuComponent
和LoginComponent
依赖于它。活动级别组件不能@Singleton范围,最好使用@Scope
注释创建自己的范围,例如:
@Retention(RetentionPolicy.RUNTIME)
@Scope
public @interface MenuScope {
}
或者,您可以不加限制。
关于范围,以下是最初Dagger 2提案的简要说明:
@Singleton @Component(modules = {…}) public interface ApplicationComponent {}
该声明使dagger可以执行以下约束:
- 给定的组件只能具有未限制范围或声明的作用域的绑定(包括类的作用域注释)。即,一个组件不能代表两个范围。如果未列出作用域,则绑定只能是无作用域的。
* 范围内的组件只能具有一个范围内的依赖项。这是强制两个组件不要各自声明自己的作用域绑定的机制。例如,每个都有自己的@Singleton缓存的两个Singleton组件将被破坏。- 组件的范围不得出现在其任何传递依赖项中。例如:SessionScoped-> RequestScoped->
SessionScoped没有任何意义,是一个错误。- @Singleton被特别对待,因为它不能具有任何范围内的依赖项。每个人都希望Singleton是“根”。
这种规则组合的目的是要强制实施范围时,组件的结构与我们以前使用Dagger 1.0
plus()的ObjectGraphs所具有的结构相同,但具有对所有对象的静态知识的能力。绑定及其范围。换句话说,当应用范围时,这将图的可构建范围限制为仅可正确构建的图。
根据我自己的实践,很明显根本不使用@Singleton
。取而代之的是,我使用@ApplicationScope
。它用于在整个应用程序上定义单例,并且没有其他限制@Singleton
。
希望对您有帮助:)。快速理解是很棘手的,需要时间,至少对我来说是这样。
我在android项目中使用Dagger2我有两个作用域:ActivityScope和FragmentScope我读了一些示例代码,他们说定义并使用ActivityScope,所以对象将在activity lifecycle中销毁。因为活动和片段有不同的生命周期,所以我们应该有两个作用域。 我的问题是:我是否需要做一些事情让代码知道,当我使用ActivityScope时,对象应该随活动生命周期一起
Dagger 2即将面世,但可用的示例甚至无法立即编译,文档是Dagger 1的复制粘贴替换。 有没有人有一个在谷歌的Dagger 2上运行的正确应用程序的例子?
我看了几篇不同的文章,这些文章似乎建议在Dagger 2中使用两种不同的方法进行自定义范围界定: > 在配置更改第2部分(Github repo)中幸存的MVP演示者: 为每个片段使用唯一的自定义作用域,例如分别为和的
在我的应用程序中,我试图创建组件 null 我已经创建了组件,并从应用程序类启动。 ContextModule类如下所示 上下文组件将是 错误:
但可以编译。它是如何工作的?
我在应用程序中有多个匕首瞄准镜 UserScope-范围表示用户会话 ActivityScope-每个活动的范围 UserComponent-CoreComponent的子组件 UserManager-创建UserComponent的单例程序 HomeComponent-依赖于UserComponent的组件 我试图在下更新用户对象,但不知何故,对象更新没有反映在它的依赖组件上。因此,一旦更新屏幕