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

使用Dagger对构造函数进行依赖注入

单于奕
2023-03-14
class A
{
    private DebugLogger logger;

    @Inject
    public A(DebugLogger logger)
    {
        this.logger = logger;
    }

    // Additional methods of A follow, etc.
}
class B
{
    private Provider<A> aFactory;

    @Inject
    public B(Provider<A> aFactory)
    {
        this.aFactory = aFactory;
    }
}

好的,到目前为止还好。但是等等,突然A需要额外的输入,比如一个对它的构造至关重要的名为“amount”的整数。现在,我的A构造函数需要如下所示:

@Inject
public A(DebugLogger logger, int amount)
{
...
}

突然这个新参数干扰了注射。此外,即使这确实有效,我也无法在从提供者检索新实例时输入“金额”,除非我弄错了。这里有几件事我可以做,我的问题是哪一件是最好的?

我可以通过添加一个setamount()方法来重构A,该方法应该在构造函数之后调用。然而,这是很难看的,因为它迫使我推迟A的构建,直到填入“金额”。如果我有两个这样的参数,“金额”和“频率”,那么我将有两个设置器,这意味着要么进行复杂的检查,以确保在调用两个设置器后构建简历,要么我将不得不在混合中添加第三个方法,如下所示:

(Somewhere in B):

A inst = aFactory.get();
inst.setAmount(5);
inst.setFrequency(7);
inst.doConstructionThatRequiresAmountAndFrequency();
class A
{
    @Inject
    public Provider<DebugLogger> loggerProvider;
    private DebugLogger logger;

    public A(int amount, int frequency)
    {
        logger = loggerProvider.get();
        // Do fancy things with amount and frequency here
        ...
    }
}

共有1个答案

微生季
2023-03-14

你所说的是所谓的辅助注射,目前不支持任何自动方式的匕首。

您可以使用工厂模式来解决这个问题:

class AFactory {
  @Inject DebugLogger debuggLogger;

  public A create(int amount, int frequency) {
    return new A(debuggLogger, amount);
  }
}

现在可以注入这个工厂,并使用它创建A的实例:

class B {
  @Inject AFactory aFactory;

  //...
}
A a = aFactory.create(amount, frequency);
 类似资料:
  • 问题内容: 我有下面的构造函数的文本编辑器类 在春豆中,我有 我观察到的是带有两个参数的构造函数,称为一致。它是随机的吗?是否应该不抛出弹簧异常,因为它不知道需要调用哪个构造函数? 问题答案: 这是Spring自动装配构造函数的结果。 它要做的第一件事是获取所有bean类的构造函数并对它们进行排序,首先将公共构造函数的参数数量减少,然后再将所有非公共构造函数的参数数量减少。这些是候选构造函数。 然

  • 和另一个类: 在这种情况下,服务将按照预期注入到A类中。据我所知,你不能在a类中使用构造函数,否则注入将无法工作。有没有一种方法可以在a类中使用一个构造函数,同时注入服务?即: 在这种情况下,我得到的服务是空的,无论如何要解决这个问题?我希望能够从类型A中使用“new”创建一个对象,并注入服务,这可能吗?

  • 我有我的,我想注入它。我想使用构造函数注入,因为我是这个类的所有者: 问题是,当触发时,该构造函数的参数(即依赖项)将作为附加项从中检索。所以我的问题是,如何将从检索的这些参数提供给我的构造函数注入? 谢谢你。

  • 我是新手。所以我想在我的使用MVVM架构的项目上尝试依赖注入。结构如下:JsonHelper- 当我试图在RemoteDataSource和Repository上注入DI时,出现了问题,因为这些类是单例类,并且有一个私有构造函数。错误代码如下所示 这是我的远程数据源和存储库代码,我已经尝试将其注入构造函数,但它说Dagger不能注入私有构造函数,所以我尝试将其注入函数,但仍然不起作用 远程数据源.

  • 我正试图在计算机上实现这个例子https://developer.android.com/jetpack/docs/guide.这就解释了Android应用程序的结构。 当我使用相同的代码时,我会出现以下错误。 我可以找出这个错误与 当我为ViewModel编写默认的零输入构造函数时,我得到了以下错误。 我想不出这个错误的原因和解决方法。

  • 嗨,我有一个问题。我想用espresso为Ui编写android测试,为了让测试不是乱七八糟的,我想嘲弄一下我的演示者。 我在应用程序里用匕首。我的配置如下: 我有组件的模块 那么我也有一个用于活动的组件和一个用于组件的模块 那么我的页面就有了子组件 和子组件的模块 然后详细信息activity注入DetailPresenter 然后是使用构造函数注入的presenter 现在在测试中,我要做的是