我找到了Get / Set缓存项的代码,但我不知道如何调用此方法,例如。如何将Func<T> getData
传递给此方法?
public class Cache<T> : MemoryCache where T : class
{
public void Set(string cacheKey, T cacheItem, CacheItemPolicy policy = null)
{
//...
}
public bool TryGet(string cacheKey, out T returnItem)
{
//...
}
public bool TryGetOrSet( string cacheKey, Func<T> getData, out T returnData, CacheItemPolicy policy = null )
{
if( TryGet( cacheKey, out returnData ) )
return true;
lock( WriteLock )
{
if( TryGet( cacheKey, out returnData ) )
return true;
returnData = getData();
Set( cacheKey, returnData, policy );
}
return false;
}
}
例如,假设缓存类型为string
。
第一个问题:通过使用方法TryGetOrSet
,如何将项目(key:userName变量,value:lastName变量)添加到缓存中?当然这个项目在缓存中不存在
var cache = new Cache<string>("UserInfo");
var userName = "test";
var lastName = "test2";
TryGetOrSet(userName, ???, out var _) // <- what should I pass to Func<T>?
答案 0 :(得分:5)
您的示例缺少T
的声明 - 但您已在课堂上对其进行了评论
public class Cache<T>
{
public void TryGetOrSet( string cacheKey, Func<T> getData, out T returnData, CacheItemPolicy policy = null )
{
...
}
}
在这种情况下,您可以传递getData
任何与预期签名匹配的方法(匿名或其他方式)。所以说你有一个实例
var myCache = new Cache<string>();
然后,任何不带参数并返回字符串的方法都可以作为该参数传递。
string value = null;
myCache.TryGetOrSet("some_key", () => "foo", out value);
此外,如果你有一个方法可以在某个地方获取你的数据,那么可以传递对它的引用
// somewhere eg "MyRepository"
public IEnumerable<MyObject> MyDataAccessMethod() { return Enumerable.Empty<MyObject>(); }
和
var myCache = new Cache<IEnumerable<MyObject>>();
var repo = new MyRepository();
IEnumerable<MyObject> data = null;
myCache.TryGetOrSet("some_key", repo.MyDataAccessMethod, out data);
作为旁注,您已声明方法返回void
但您返回布尔值 - 这是有道理的,因为TryXXX
方法应返回布尔值表示成功。
public bool TryGetOrSet( string cacheKey, Func<T> getData, out T returnData, CacheItemPolicy policy = null )
{
...
}
响应您的更新:
第一个问题:通过使用方法TryGetOrSet如何将项目(key:userName变量,value:lastName变量)添加到缓存中?当然,当这个项目不存在于缓存
中时
var cache = new Cache<string>("UserInfo");
var userName = "test";
var lastName = "test2";
string result = null;
TryGetOrSet(userName, () => lastName, out result) ;