2012-06-25 4 views
2

Я хочу, чтобы иметь возможность передать мою фактическую функцию синтаксического анализа в моем обратном вызове обновления кэша. Как я могу оптимизировать дублирование кода ниже, используя делегатов? СпасибоДелегат для 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? 
    ^^^^^^^^^^^^^^^^^^^^^^^^^^ 
} 
+0

Итак, в чем собственно проблема? –

+0

Также см. «[Переполнение стека не допускает теги в заголовках] (http://meta.stackexchange.com/a/130208)». –

+0

thx. Я обновил вопрос. – River

ответ

1

Как это:

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(); 
} 
+0

Thx alot. Func parseContent - можете ли вы изменить этот синтаксис, чтобы принять общий тип повтора T? Я пробовал, но не мог – River

+0

@River: 'Content = parseContent()' не имеет смысла с общей точки зрения, если сам Content не является общим типом. – StriplingWarrior

1

Это абсолютно разумно передать в обратном вызове, как вы упомянули в комментарии в своем коде.

Просто изменение:

public void getContent() {...} 

к:

public void getContent(Func<TypeOfValue> parsecallback) {...} 

И изменить itemUpdateCallBack принять Func<TypeOfValue> parsecallback в качестве аргумента тоже.

От снаружи, вам нужно что-то вроде этого:

Func<TypeOfValue> func =() => 
{ 
    MethodCall1(); 
    MethodCall2(); 
    return MethodCall3(); 
}; 
myObj.getContent(func); 

Либо это, либо вы можете передать его в конструктор. Он менее гибкий, но идеально подходит для ситуаций, когда вы знаете, что это всегда будет одинаковым для данного объекта.

Смежные вопросы