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));

我想要实现的是“如果缓存为空获取数据并添加到缓存”逻辑仅放置在一个地方。

我希望这是有道理的 :)

哦,顺便问一下,问题是:这可能吗?

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 Your Func On。它讨论了您使用相同方法解决的问题。

于 2010-04-23T08:09:24.020 回答