4

アプリケーション全体で使用できる汎用のCacheManagerを作成しようとしています。これにより、キャッシュアイテムのすべての管理が一貫した方法で行われ、いくつかのキャッシュアクセスパターンに準拠するようになります。これは、必要に応じてすべてのタイプのオブジェクトをキャッシュするために使用されます。

デリゲートを使用して関数をメソッドに渡すことができることを理解しています。これを以下に示します。

public static T GetGlobalCacheitem( Func<int ,int , T> populateCacheCall )
        {
            string cacheKey = "test";
            var cachedObject = CacheFactory<T>.GlobalCache.GetGlobalCacheItem(cacheKey);

            if (cachedObject == null)
            {
                cachedObject =  populateCacheCall();
                CacheFactory<T>.GlobalCache.AddGlobalCacheItem(cachedObject, cacheKey);
            }
            return cachedObject;
        }

しかし、私には2つの問題があります。

  1. キャッシュにデータを入力するために渡したい関数のほとんどには、必要なパラメーターがあります。上記の例のように、これは2つのintパラメーターを使用するメソッドです。最初の質問は、このキャッシュハンドラーでは認識されないため、関数を呼び出すパラメーターをどのように渡すことができるかということです。これは、この外部で認識されます。また、これは次の質問2に関連しており、関数が必要とするパラメーターの数に関係なく、アプローチでこれをどのように機能させることができますか(存在する場合)

  2. 2番目の問題は、キャッシュアイテムを設定するために渡す必要のある関数の多くが変化することです。つまり、パラメーターがないもの、パラメーターが1つあるもの、複数あるもの、それぞれのタイプがあります。これらのパラメータのうち、変化する可能性があります。それで、私が使用した関数のすべての可能な組み合わせをカバーするすべての可能な署名で関数を定義する必要なしに、これをどのように機能させることができるでしょうか。

4

4 に答える 4

3

関数のパラメーターがGetGlobalCacheitemメソッドの外部でいっぱいになる場合は、次のような別のデリゲートを使用して関数の呼び出しを詐欺することができます。

public static T GetGlobalCacheitem<T>(Func<T> populateCacheCall)

そしてそれを呼びます:

Func<int ,int , object> tempPopulateCacheCall=(a,b)=>new object();

GetGlobalCacheitem(()=>tempPopulateCacheCall(1,2))

または、パラメータが変化するその他の関数シグネチャ

Func<int , object> tempPopulateCacheCall=(a)=>new object();

GetGlobalCacheitem(()=>tempPopulateCacheCall(1))
于 2013-02-18T12:36:21.803 に答える
0

List<P>パラメータを最初のパラメータとして渡すか、パラメータとして使用できTuple<P>ます。

また、関数とパラメーターのハッシュコードからグローバルキャッシュキーを作成してみてください。

私がこの権利を理解した場合、DapperIdentity関数のシナリオのようなコードが見つかる可能性がありますSqlMapper

于 2013-02-18T12:30:17.967 に答える
0

関数パラメーターをカプセル化するクラスを作成して、パラメーターなしでこのクラスインスタンスからこの関数を呼び出すことができるようにすることができます。これらのパラメーターの引数は、コンストラクターに配置されます。

interface ICachedFunction<out T>
{
    T Invoke();
}

class CustomFunctionWithVariousParameters<T> : ICachedFunction<T>
{
    private readonly Func<int, string, T> _function;
    private readonly int _parameter1;
    private readonly string _parameter2;

    public CustomFunctionWithVariousParameters(int parameter1, string parameter2, Func<int, string, T> function)
    {
        _function = function;
        _parameter1 = parameter1;
        _parameter2 = parameter2;
    }

    public T Invoke()
    {
        return _function(_parameter1, _parameter2);
    }
}

これで、このソリューションをメソッドで使用できます。

public static T GetGlobalCacheitem( ICachedFunction<T> populateCacheCall )

このアプローチがお役に立てば幸いです。

于 2013-02-18T12:33:38.517 に答える
0

Reza Arabが提案した構造は、あなたが考えている構造と一致しているので良いと思います。ただし、私の意見では、グローバルキャッシュを使用すると、特に効果的なガベージコレクションが困難になるため、望ましくありません(キャッシュされたオブジェクトへの弱参照を使用しない限り。ただし、繰り返し作成および削除されるオブジェクトはどうでしょうか?その場合、弱参照効率的なキャッシュを禁止します)。

于 2013-02-18T14:18:13.907 に答える