Делегат для Cache.Insert
Я хочу быть в состоянии передать мою фактическую функцию синтаксического анализа в моем обратном вызове обновления кэша. Как я могу оптимизировать дублирование моего кода ниже с помощью делегатов? Спасибо
//intial setup code
public void getJSONContent() //can I pass itemUpdateCallback in here? Does it make sense?
{
Content = (String)HttpContext.Current.Cache[Path];
if (Content == null)
{
Content = parseXMLContent();
HttpContext.Current.Cache.Insert(
key,
Content,
new CacheDependency(Path),
Cache.NoAbsoluteExpiration,
Cache.NoSlidingExpiration,
jsonUpdateCallback); //callback in the event of my file in cache has changed
^^^^^^^^^^^^^^^^^^
}
}
private void jsonUpdateCallback(string key, CacheItemUpdateReason reason, out object value, out CacheDependency dependency, out DateTime exipriation, out TimeSpan slidingExpiration)
{
dependency = new CacheDependency(key);
exipriation = Cache.NoAbsoluteExpiration;
slidingExpiration = Cache.NoSlidingExpiration;
value = jsonXMLContent(); //how can pass this function into here, so I can can have different parse functions using the same code?
^^^^^^^^^^^^^^^^^^^^^^^^^^
}
//intial setup code
public void getXMLContent() //can I pass itemUpdateCallback in here? Does it make sense?
{
Content = (String)HttpContext.Current.Cache[Path];
if (Content == null)
{
Content = parseXMLContent();
HttpContext.Current.Cache.Insert(
key,
Content,
new CacheDependency(Path),
Cache.NoAbsoluteExpiration,
Cache.NoSlidingExpiration,
xmlUpdateCallback); //callback in the event of my file in cache has changed
^^^^^^^^^^^^^^^^^^
}
}
private void xmlUpdateCallback(string key, CacheItemUpdateReason reason, out object value, out CacheDependency dependency, out DateTime exipriation, out TimeSpan slidingExpiration)
{
dependency = new CacheDependency(key);
exipriation = Cache.NoAbsoluteExpiration;
slidingExpiration = Cache.NoSlidingExpiration;
value = parseXMLContent(); //how can pass this function into here, so I can can have different parse functions using the same code?
^^^^^^^^^^^^^^^^^^^^^^^^^^
}
2 ответа
Решение
Как это:
public void getXMLContent()
{
getContent(parseXmlContent);
}
public void getContent(Func<string> parseContent)
{
Content = (String)HttpContext.Current.Cache[Path];
if (Content == null)
{
Content = parseContent();
HttpContext.Current.Cache.Insert(
key,
Content,
new CacheDependency(Path),
Cache.NoAbsoluteExpiration,
Cache.NoSlidingExpiration,
delegate(string key2, CacheItemUpdateReason reason, out object value, out CacheDependency dependency, out DateTime expiration, out TimeSpan slidingExpiration) {
itemUpdateCallback(key2, reason, parseContent, out value, out dependency, out expiration, out slidingExpiration);
});
}
}
private void itemUpdateCallback(string key, CacheItemUpdateReason reason, Func<string> parseContent, out object value, out CacheDependency dependency, out DateTime exipriation, out TimeSpan slidingExpiration)
{
dependency = new CacheDependency(key);
exipriation = Cache.NoAbsoluteExpiration;
slidingExpiration = Cache.NoSlidingExpiration;
value = parseContent();
}
Абсолютно имеет смысл передать обратный вызов, как вы упомянули в комментарии в своем коде.
Просто измените:
public void getContent() {...}
чтобы:
public void getContent(Func<TypeOfValue> parsecallback) {...}
И измените itemUpdateCallBack, чтобы взять Func<TypeOfValue> parsecallback
в качестве аргумента тоже.
Со стороны вам нужно что-то вроде этого:
Func<TypeOfValue> func = () =>
{
MethodCall1();
MethodCall2();
return MethodCall3();
};
myObj.getContent(func);
Либо так, либо вы можете передать это в свой конструктор. Это менее гибко, но идеально подходит для ситуаций, когда вы знаете, что это всегда будет одинаковым для данного объекта.