5

में मेमोरी कैश मैं अपने वेब एपीआई में Caching की तलाश में था जहां मैं बाद में कॉल के लिए एक एपीआई विधि (जो 12hrs में एक बार बदलता है) के आउटपुट का उपयोग कर सकता था और फिर मुझे this solution एसओ पर मिला, लेकिन मुझे कठिनाई हो रही है समझ और नीचे दिए गए कोडवेब एपीआई

private IEnumerable<TEntity> GetFromCache<TEntity>(string key, Func<IEnumerable<TEntity>> valueFactory) where TEntity : class 
{ 
    ObjectCache cache = MemoryCache.Default; 
    var newValue = new Lazy<IEnumerable<TEntity>>(valueFactory);    
    CacheItemPolicy policy = new CacheItemPolicy { AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(30) }; 
    //The line below returns existing item or adds the new value if it doesn't exist 
    var value = cache.AddOrGetExisting(key, newValue, policy) as Lazy<IEnumerable<TEntity>>; 
    return (value ?? newValue).Value; // Lazy<T> handles the locking itself 
} 

का उपयोग करने में मुझे यकीन है कि कैसे फोन और नीचे संदर्भ में इस विधि का उपयोग करने के लिए नहीं कर रहा हूँ? मैं एक विधि

public IEnumerable<Employee> Get() 
    { 
     return repository.GetEmployees().OrderBy(c => c.EmpId); 
    } 

जाओ है और मैं) जाओ और GetEmployeeById (मेरे अन्य तरीकों में उपयोग के उत्पादन में कैश या (खोज)

 public Movie GetEmployeeById(int EmpId) 
     { 
      //Search Employee in Cached Get 
     } 

     public IEnumerable<Employee> GetEmployeeBySearchString(string searchstr) 
     { 
      //Search in Cached Get 
     } 

उत्तर

8

मैं अपने विधि अपडेट वापस जाने के लिए करना चाहते हैं IEnumberable के बजाय कक्षाएं:

:

private TEntity GetFromCache<TEntity>(string key, Func<TEntity> valueFactory) where TEntity : class 
{ 
    ObjectCache cache = MemoryCache.Default; 
    // the lazy class provides lazy initializtion which will eavaluate the valueFactory expression only if the item does not exist in cache 
    var newValue = new Lazy<TEntity>(valueFactory);    
    CacheItemPolicy policy = new CacheItemPolicy { AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(30) }; 
    //The line below returns existing item or adds the new value if it doesn't exist 
    var value = cache.AddOrGetExisting(key, newValue, policy) as Lazy<TEntity>; 
    return (value ?? newValue).Value; // Lazy<T> handles the locking itself 
} 

तो आप की तरह इस विधि का उपयोग कर सकते हैं

public Movie GetMovieById(int movieId) 
{ 
    var cacheKey = "movie" + movieId; 
    var movie = GetFromCache<Movie>(cacheKey,() => {  
     // load movie from DB 
     return context.Movies.First(x => x.Id == movieId); 
    }); 
    return movie; 
} 

और खोज करने के लिए फिल्में

[ActionName("Search")] 
public IEnumerable<Movie> GetMovieBySearchParameter(string searchstr) 
{ 
    var cacheKey = "movies" + searchstr; 
    var movies = GetFromCache<IEnumerable<Movie>>(cacheKey,() => {    
      return repository.GetMovies().OrderBy(c => c.MovieId).ToList(); 
    }); 
    return movies; 
} 
+0

@little यह GetFromCache विधि –

+0

@little आप valueFactory समारोह के अंदर अपने भंडार बुलाना चाहिए के अंदर किया जाता है (यह केवल निष्पादित किया जाएगा यदि वस्तु में नहीं है कैश)। मेरा जवाब देखें, मैं एक भंडार नहीं बुला रहा हूं लेकिन सीधे संदर्भ को संदर्भित करता हूं, इसलिए संदर्भ को प्रतिस्थापन के साथ प्रतिस्थापित करें। –

+0

@little मैंने अपने उदाहरण में GetMovieBySearchParameter विधि अपडेट की है और अब यह एक भंडार का उपयोग कर रहा है। –