我正在尝试(第一次)使用依赖注入来构建令牌。我有一个菱形层次结构问题,我需要将我的数据的签名哈希添加到实际数据本身。
结果,我发现自己多次在原始数据提供者上调用 get()。这很好,但在图表的下方,有基于时间的组件,因此,后续调用返回的数据是不同的。
建议使用 Singleton Provider 模型的解决方案。对于此 Provider,对 get() 的后续调用返回相同的对象(引用)。此 Provider 缓存第一次调用 get() 的结果并不断返回该结果。在注入依赖项时,我两次注入此提供程序的同一个实例,结果它两次返回相同的数据。
这让我想到,有没有什么情况你不想使用 Singleton Provider?如果你期待不同的结果,不应该每次都创建一个新的 Provider 实例吗?
public MyUnderscoreStringSingletonProvider implements Provider<String>
{
private final Provider<String> mySomeOtherStringProvider;
private String myCachedString;
public MyUnderscoreStringSingletonProvider(
Provider<String> someOtherStringProvider )
{
mySomeOtherStringProvider = someOtherStringProvider;
myCachedString = null;
}
@Override
public String get()
{
if( myCachedString == null )
{
myCachedString = create();
}
return myCachedString;
}
private String create()
{
return "_" + mySomeOtherStringProvider.get();
}
}
// ...
public class SomeCoolService
{
// ...
public Provider<String> injectStringDoubler()
{
final Provider<String> stringProvider =
injectUnderScoreStringProvider();
return new TwoConcatendatedStringsProvider(
stringProvider,
stringProvider );
// This would not work if Singleton Provider was not used.
// Why should we ever use non-Singleton Providers?
}
protected Provider<String> injectUnderScoreStringProvider()
{
return new MyUnderscoreStringSingletonProvider(
injectMyTimebasedStringProvider() // returns different result
// depending
// on time.
);
}
// ...
}