【问题标题】:How to make subcomponent singleton in dagger 2?如何在匕首 2 中制作子组件单例?
【发布时间】:2016-06-13 19:17:45
【问题描述】:

我想让我的子组件成为单例,这样我也可以让 Login Presenter 成为单例。这可能吗?

@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
    LoginComponent getLoginComponent();
}

@Singleton
@Subcomponent(modules = LoginModule.class)
public interface LoginComponent {
}

public class LoginComponent {
    @Singleton
    LoginPresenter getLoginPresenter();
}

【问题讨论】:

  • 所以让你的LoginPresenter 成为单身人士。为什么必须从子组件中提供它?
  • 对我来说,子组件代表一个功能,我想将我所有的对象创建保留在那里。
  • 组件和子组件是用来封装绑定图的对象。由这些绑定创建的实例可以选择具有与组件的生命周期相匹配的生命周期,并与范围注释定义的逻辑概念相关联。因此,您应该使用组件和子组件来建模相关的生命周期(例如 Android 或 Singleton 中的 Application/Singleton、Activity 等,服务器中的 Request),而不是功能。功能级组合应该使用模块来完成,就像您似乎已经完成的那样。
  • 如果我使用模块进行功能级组合,那么我的 AppComponent 会变得越来越大,为了组织起见,我想避免这种情况。但我想你是对的,两个不同的组件不能有相同的生命周期。我希望这是可能的。

标签: android dagger-2


【解决方案1】:

@Subcomponents 不能变成@Singleton

虽然@Singleton 规范对此有点模糊,但“单例”通常意味着“每个应用程序一个”。由于 @Subcomponent 是通过组件上的工厂方法创建的,因此单例绑定实例“每个应用程序一个”的唯一方式是,如果单例子组件是单例组件及其工厂方法每个应用程序只调用一次。强制执行该约束几乎是不可能的,因此该模式可能只是错误的来源。

【讨论】:

  • 你知道这个“限制”最近是否改变了吗?看来我现在可以做到了,但我不确定这是否是一个错误(或者我做错了什么),因为我找不到合适的发行说明。
  • 如果你能做到,那就是一个错误。可以存档吗?
  • 即使有多个@Subcomponent 实例,在主@Singleton 组件模块中定义的单例实例即使在不同的子组件实例中被请求时仍然是单例的。我的假设正确吗?
猜你喜欢
  • 1970-01-01
  • 2020-10-02
  • 2015-01-17
  • 2018-01-17
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多