当前位置: 首页 > 知识库问答 >
问题:

匕首和mvp-演示者应该使用匕首注射吗

申屠喜
2023-03-14

这很好,但是如果我使用全局组件甚至子组件中的一个模块,那么应该传入上下文。因此,这意味着如果我用匕首注入演示器,它将被绑定到ApplicationContext。这使得作为JUnit进行测试变得困难。Android代码不应该在演示器中。

所以我想问的是,最好的做法是只在活动、片段、广播接收器和服务中使用匕首吗?就mvp架构而言,这就是。另一个解决方案设计另一个dagger组件,但不是与appcomponent或ApplicationContext无关的子组件。通常的做法是什么?

更新:让我们看一个真实的例子:

public class MyApplication extends Application {

    private AppComponent appComponent;

    @Override
    public void onCreate() {
        super.onCreate();
        appComponent = initDagger(this);
    }

    public AppComponent getAppComponent() {
        return appComponent;
    }

    protected AppComponent initDagger(PomeloApplication application) {
        return DaggerAppComponent.builder()
                .appModule(new AppModule(application))
                .build();
    }}
public WelcomePresenter(Context context) {
        super(context);
        presenterComponent = ((MyApplication) context).getAppComponent();
        presenterComponent.inject(this);
    }

所以我认为应该有一个规则--MVP更喜欢手动构造函数注入而不是匕首注入,因为类不应该知道它是如何注入的。被注射的东西不应该关心它是如何注射的。

根据公认的答案,Dagger.Android概述了我所说的问题。

共有1个答案

钱振
2023-03-14

我也同意这样的说法:“在你的演示器中没有android相关的代码总是一个好主意,dagger不会干扰这一点。”

首先,我想提请注意的是,从dagger Version2.10开始,您可以使用dagger.Android包,它简化了活动和片段的注入,因此您不需要在应用程序中使用MyApplication强制转换。

其次,为什么不将WelcomePresenter注入活动或片段中,反之亦然?

 类似资料:
  • 我不熟悉匕首和莫基托。我尝试在单元测试中使用Dagger模块中定义的构造函数,以便使用默认值创建对象。 这是模块: @模块类自动关闭倒计时模块{ 这就是我在单元测试中模拟AutoCloseCountDown类的方法: @RunWith(MockitoJUnitRunner.class)公共类AutoCloseCountDownTimerTest{ 如何实现自动关闭的CountDownTimer将在

  • 我正在MVVM和Dagger 2中制作小型Android应用程序。但是我不知道如何正确使用Dagger 2,以防我有一个活动和两个片段。这两个片段都是ViewModels的所有者。我已经将ViewModelProvider注入了片段,但我仍然对这个解决方案感到困惑。也许有人会改进我的代码? 活动: 第一个片段: 第二个片段: 在这种情况下,两个片段都可以工作,但我只能在其中一个片段中注入ViewM

  • 我使用Flink(最新的git)从Kafka流到卡桑德拉。为了简化单元测试,我通过dagger添加了依赖注入。 ObjectGraph似乎正确地设置了自己,但是“内部对象”被Flink标记为“不可序列化”。如果我直接包括这些对象,它们会起作用--那么有什么区别呢? 通过Dagger Lazy 实例化的对象也不会序列化。 线程“main”org.apache.flink.api.common.inv

  • 嗨,我试图找出如何做一个干净的第三方注入。我想把奥托巴士适当地注入我的服务和活动中。我看到你可以在构造函数上使用inject,但是由于我没有任何Android构造函数,我想知道我如何才能inject我的总线。 Iv创建了一个模块,该模块提供了总线的新实例。Iv还创建了一个组件,该组件具有总线对象的接口。 但是我如何才能得到这个注入,我应该在哪里启动我的图表? 我想做的就是: 我看了这个例子(htt

  • 我正在使用Dagger 2,在为我的类实现测试时,模块中的generate singleton providers存在一些问题。 所以我有两个问题。 > 我不能使用构造函数注入,因为有一个默认的构造函数。如何从测试模块中获取Foo? 在和中,如何确保在运行每个测试时创建的新实例? 谢谢

  • 我在android项目中使用Dagger2我有两个作用域:ActivityScope和FragmentScope我读了一些示例代码,他们说定义并使用ActivityScope,所以对象将在activity lifecycle中销毁。因为活动和片段有不同的生命周期,所以我们应该有两个作用域。 我的问题是:我是否需要做一些事情让代码知道,当我使用ActivityScope时,对象应该随活动生命周期一起