当前位置: 首页 > 面试题库 >

匕首2中的范围

黄骏喆
2023-03-14
问题内容

我可能错过了一些东西,但我认为像@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,都会得到MailProviderand的新实例AccountManager。我认为它们在同一范围内,因此应该是单例(在同一范围内)。

我了解完全错误的事情吗?如何为匕首2中的多个组件定义一个真正的单例?


问题答案:

我假设LoginComponentMenuComponent分别使用,例如LoginActivity和中MenuActivity。每个组件都是内置的Activity.onCreate。如果是这样,则每次创建新活动,模块和依赖项时,都会重新创建组件,而与它们绑定的范围无关。因此,你得到的新情况MainProviderAccountManager每一次。

MenuActivity并且LoginActivity具有单独的生命周期,因此MailModule两者的依赖关系不能都是单例的。你需要的是申报根组件与@Singleton范围(例如,在应用程序子类),化妆MenuComponentLoginComponent依赖于它。活动级别组件不能@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的组件 我试图在下更新用户对象,但不知何故,对象更新没有反映在它的依赖组件上。因此,一旦更新屏幕