私は(初めて)依存性注入を使用してトークンを構築しようとしています。ダイアモンド階層の問題があり、データの署名付きハッシュを実際のデータ自体の前に追加する必要があります。
その結果、元のデータプロバイダーでget()を複数回呼び出していることに気付きました。これは問題ありませんが、グラフのさらに下には時間ベースのコンポーネントがあり、その結果、後続の呼び出しで返されるデータは異なります。
シングルトンプロバイダーモデルを使用するソリューションが提案されました。このプロバイダーの場合、get()を後で呼び出すと、同じオブジェクト(参照)が返されます。このプロバイダーは、get()の最初の呼び出しの結果をキャッシュし、それを継続的に返します。依存関係を注入するとき、このプロバイダーの同じインスタンスを2回注入すると、その結果、同じデータが2回返されます。
これは私に考えさせられました、あなたがシングルトンプロバイダーを使いたくない状況はありますか?別の結果が予想される場合は、毎回新しいプロバイダーインスタンスを作成する必要がありますか?
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.
);
}
// ...
}