gpt4 book ai didi

android - 使用 Dagger 对构造函数进行依赖注入(inject)

转载 作者:IT老高 更新时间:2023-10-28 21:57:45 30 4
gpt4 key购买 nike

所以,我目前正在重新设计我的一个 Android 应用程序以使用 Dagger .我的应用又大又复杂,最近遇到了以下场景:

对象 A 需要一个特殊的 DebugLogger 实例,它是注入(inject)的完美候选者。我可以通过 A 的构造函数注入(inject)它,而不是传递记录器。这看起来像这样:

class A
{
private DebugLogger logger;

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

// Additional methods of A follow, etc.
}

到目前为止,这是有道理的。但是,A需要由另一个类B来构造。A的多个实例必须构造,所以按照Dagger的做事方式,我简单地注入(inject)了一个Provider<A>。进入B:

class B
{
private Provider<A> aFactory;

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

好的,到目前为止很好。但是等等,突然 A 需要额外的输入,例如一个称为“数量”的整数,这对其构造至关重要。现在,我的 A 构造函数需要如下所示:

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

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

我可以通过添加 setAmount() 来重构 A预期在构造函数之后调用的方法。然而,这很丑陋,因为它迫使我延迟 A 的构建,直到填写“数量”。如果我有两个这样的参数,“数量”和“频率”,那么我将有两个 setter ,这意味着要么复杂的检查以确保在调用两个 setter 后 A 的构造恢复,否则我将不得不添加第三种方法,如下所示:

(Somewhere in B):

A inst = aFactory.get();
inst.setAmount(5);
inst.setFrequency(7);
inst.doConstructionThatRequiresAmountAndFrequency();

另一种选择是我不使用基于构造函数的注入(inject),而是使用基于字段的注入(inject)。但是现在,我必须公开我的领域。这不适合我,因为现在我有义务将我的类(class)的内部数据透露给其他类(class)。

到目前为止,我能想到的唯一有点优雅的解决方案是对提供程序使用基于字段的注入(inject),如下所示:

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
...
}
}

即使如此,我也不确定时机,因为我不确定 Dagger 是否会在调用我的构造函数之前注入(inject)提供程序。

有没有更好的方法?我只是错过了 Dagger 的工作原理吗?

最佳答案

您所说的称为辅助注入(inject),目前 Dagger 不以任何自动方式支持。

您可以使用工厂模式解决此问题:

class AFactory {
@Inject DebugLogger debuggLogger;

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

现在您可以注入(inject)这个工厂并使用它来创建 A 的实例:

class B {
@Inject AFactory aFactory;

//...
}

当您需要使用“数量”和“频率”创建 A 时,您可以使用工厂。

A a = aFactory.create(amount, frequency);

这允许 A 拥有记录器、数量和频率字段的 final 实例,同时仍使用注入(inject)来提供记录器实例。

Guice 有一个辅助注入(inject)插件,它基本上可以自动为您创建这些工厂。有have been discussion在 Dagger 邮件列表上关于添加它们的适当方式,但在撰写本文时尚未决定。

关于android - 使用 Dagger 对构造函数进行依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16040125/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com