所以,我目前正在重新设计我的Android应用使用匕首 。 我的应用程序是大型,复杂的,我最近遇到以下情形传来:
对象A需要一个特殊的DebugLogger实例,它是注射用完美的候选人。 而是绕过记录的我可以刚刚经历了一场的构造注入它。 这看起来是这样的:
class A
{
private DebugLogger logger;
@Inject
public A(DebugLogger logger)
{
this.logger = logger;
}
// Additional methods of A follow, etc.
}
到目前为止,这是有道理的。 然而,A需要由另一个类B.多个实例构造必须构造,所以下面做事的匕首的方式,我简单的注入Provider<A>
到B:
class B
{
private Provider<A> aFactory;
@Inject
public B(Provider<A> aFactory)
{
this.aFactory = aFactory;
}
}
好了,好为止。 别急,突然需要额外的投入,如所谓的“量”的整数,它的建设是至关重要的。 现在,我的构造函数需要这个样子:
@Inject
public A(DebugLogger logger, int amount)
{
...
}
突然,这个新的参数,干扰注射。 此外,即使这没有工作,就没有办法,我在“量”通过从供应商获取一个新的实例时,除非是我弄错了。 有几件事情,我可以在这里做的,而我的问题是哪一个是最好的?
我可以通过添加重构一个setAmount()
预计在构造函数后要调用的方法。 这是丑陋的,但是,因为它迫使我延迟的建设,直到“量”已被填补。如果我有两个这样的参数,“量”和“频率”,那么我将有两个setter方法,这将意味着无论是复杂的检查,以确保那建造重新开始制定者都被称为后,或者我会还添加第三个方法混进去,就像这样:
(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
...
}
}
即使如此,我不确定的时间,因为我不知道如果我的构造函数被调用之前匕首将注入的供应商。
有没有更好的办法? 我只是失去了一些东西约匕首是如何工作的?