次の形式の関数をどのように記述しますか。
A(key, B(key, C(key, ValFactory(key))))
A、B、および C には次の署名があります。
TResult GetOrAdd(string key, Func<string, TResult> generator);
Valfactory には次の署名があります。
TResult Get(string key);
「連鎖」関数の数には制限がないため、A、B、または A、B、C、または A、B、C、D、E などにすることができます。
関数 A、B、C などを LinkedList に格納します
どうすれば好きなように呼び出すことができますか?
明確にするためにいくつかの情報を追加して編集します。
マルチレベルキャッシュを実装するにはこれが必要です。すべて「GetOrAdd」関数を実装するいくつかの異なるキャッシュがあります。第 1 レベルのキャッシュは、既に GetOrAdd 関数を持っている単なる ConcurrentDictionary です。
キャッシュの仕組みは、第 1 レベルのキャッシュに特定のキーのエントリがない場合、第 2 レベルのキャッシュを調べようとすることです。第 2 レベルのキャッシュは、ミスなどで第 3 レベルのキャッシュを参照します。
キャッシュは別のキャッシュの知識を持つべきではなく、署名を実装するだけですTResult GetOrAdd(string, Func<string, TResult> functionToCallOnCacheMiss)