3

Funcとデリゲートについて何か読んだことがありますが、それらはメソッドをパラメーターとして渡すのに役立ちます。今、私はキャッシングサービスを持っています、そしてそれはこの宣言を持っています:

public static void AddToCache<T>(T model, double millisecs, string cacheId) where T : class
public static T GetFromCache<T>(string cacheId) where T : class

したがって、データをキャッシュしたい場所で、データがキャッシュに存在するかどうかを確認し(GetFromCacheを使用)、存在しない場合は、どこかからデータを取得して、キャッシュに追加します(AddToCacheを使用)。

ここで、AddToCacheメソッドをパラメーターで拡張したいと思います。これは、データを取得するために呼び出すクラス+メソッドです。宣言は次のようになります。

public static void AddToCache<T>(T model, double millisecs, string cacheId, Func/Delegate methode) where T : class

次に、このメソッドは、キャッシュにデータがあるかどうかをチェックし、ない場合は、提供されたメソッドを介してデータ自体を取得できます。

次に、呼び出しコードで私は言うことができます:

AddToCache<Person>(p, 10000, "Person", new PersonService().GetPersonById(1));
AddToCache<Advert>(a, 100000, "Advert", new AdvertService().GetAdverts(3));

私が達成したいのは、「キャッシュが空の場合、データを取得してキャッシュに追加する」ロジックが1つの場所にのみ配置されることです。

私はこれが理にかなっていることを願っています:)

ちなみに、質問は次のとおりです。これは可能ですか?

4

3 に答える 3

7

あなたはおそらく欲しい:

public static void AddToCache<T>(T model, double millisecs, string cacheId, 
   Func<T> methode) where T : class;

使用法:

AddToCache<Person>(p, 10000, "Person", 
       () => new PersonService().GetPersonById(1));
于 2010-04-23T08:02:47.053 に答える
3

このような:

public static void AddToCache<T>(T model, double millisecs, string cacheId, Func<T> getValueFunction ) where T : class
{
  // if miss:
  var person = getValueFunction.Invoke();
}

呼び出しは次のようになります。

AddToCache( p , 1, "Person", () => new PersonService().GetPersonById(1) );
于 2010-04-23T08:07:41.113 に答える
1

このブログ投稿を読むことをお勧めします:Get YourFuncOn。同じアプローチで解決しようとしている問題について説明します。

于 2010-04-23T08:09:24.020 に答える