2013-08-12 8 views
10

ImはC#のジェネリックスに新しく、プログラムの他の部分でモデルオブジェクトを要求できるストレージを作成しようとしています。 私のキャッシュクラスにオブジェクトがある場合、そのオブジェクトの日付がチェックされ、オブジェクトが10分以上経過していない場合は返されます。 10分以上経過している場合は、サーバーからオンラインで更新されたモデルをダウンロードします。 オブジェクトをダウンロードして返します。オブジェクトをキャッシュするクラスを作成するにはどうすればよいですか?

しかし、私はDateTimeと私のオブジェクトをペアにする問題を抱えています。

// model 
public class Person 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Person p = new Person(); 

     Cache c = new Cache(); 

     p = c.Get<Person>(p); 
    } 
} 

public class Cache 
{ 
    struct DatedObject<T> 
    { 
     public DateTime Time { get; set; } 
     public T Obj { get; set; } 
    } 

    List<DatedObject<T>> objects; 

    public Cache() 
    { 
     objects = new List<DatedObject<T>>(); 
    } 

    public T Get<T>(T obj) 
    { 
     bool found = false; 

     // search to see if the object is stored 
     foreach(var elem in objects) 
      if(elem.ToString().Equals(obj.ToString())) 
      { 
       // the object is found 
       found = true; 

       // check to see if it is fresh 
       TimeSpan sp = DateTime.Now - elem.Time; 

       if(sp.TotalMinutes <= 10) 
        return elem; 
      } 


     // object was not found or out of date 

     // download object from server 
     var ret = JsonConvert.DeserializeObject<T>("DOWNLOADED JSON STRING"); 

     if(found) 
     { 
      // redate the object and replace it in list 
      foreach(var elem in objects) 
       if(elem.Obj.ToString().Equals(obj.ToString())) 
       { 
        elem.Obj = ret; 
        elem.Time = DateTime.Now; 
       } 
     } 
     else 
     { 
      // add the object to the list 
      objects.Add(new DatedObject<T>() { Time = DateTime.Now, Obj = ret });     
     } 

     return ret; 
    } 
} 
+0

オブジェクトをペアにする際の問題/エラーの詳細を教えてください。おそらく、あなたは 'DatedObject'の構造の代わりにクラスを試してみることができます。独自のクラスオブジェクトを作成したくない場合は、Tuple – Rex

+0

[Akavache](https://github.com/github/Akavache)が価値があるかもしれませんに。 –

答えて

22

あなたはあなたのアプリケーションへの参照としてSystem.RunTime.Cachingアセンブリを追加する必要があります.NETフレームワークhttp://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache.aspx

の一部として使用可能なメモリのキャッシュクラスをご覧ください。以下は、アイテムを追加してキャッシュから削除するヘルパークラスです。

using System; 
using System.Runtime.Caching; 

public static class CacheHelper 
{ 
    public static void SaveTocache(string cacheKey, object savedItem, DateTime absoluteExpiration) 
    { 
     MemoryCache.Default.Add(cacheKey, savedItem, absoluteExpiration); 
    } 

    public static T GetFromCache<T>(string cacheKey) where T : class 
    { 
     return MemoryCache.Default[cacheKey] as T; 
    } 

    public static void RemoveFromCache(string cacheKey) 
    { 
     MemoryCache.Default.Remove(cacheKey); 
    } 

    public static bool IsIncache(string cacheKey) 
    { 
     return MemoryCache.Default[cacheKey] != null; 
    } 
} 

このことについての素晴らしいところは、スレッドセーフであるということです、そしてそれはあなたのために自動的にキャッシュを有効期限切れの世話をします。だから、基本的には、MemoryCacheから項目を取得するのがnullかどうかをチェックするだけです。 メモメモMemoryCacheは.NET 4.0以降でのみ利用可能です

アプリケーションがWebアプリケーションの場合は、MemoryCacheではなくSystem.Web.Cachingを使用してください。 System.Web.Cachingは.NET 1.1以降で使用でき、プロジェクトに追加する必要のある追加の参照はありません。 Web用の同じヘルパークラスを使用します。

using System.Web; 

public static class CacheHelper 
{ 
    public static void SaveTocache(string cacheKey, object savedItem, DateTime absoluteExpiration) 
    { 
     if (IsIncache(cacheKey)) 
     { 
      HttpContext.Current.Cache.Remove(cacheKey); 
     } 

     HttpContext.Current.Cache.Add(cacheKey, savedItem, null, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(0, 10, 0), System.Web.Caching.CacheItemPriority.Default, null); 
    } 

    public static T GetFromCache<T>(string cacheKey) where T : class 
    { 
     return HttpContext.Current.Cache[cacheKey] as T; 
    } 

    public static void RemoveFromCache(string cacheKey) 
    { 
     HttpContext.Current.Cache.Remove(cacheKey); 
    } 

    public static bool IsIncache(string cacheKey) 
    { 
     return HttpContext.Current.Cache[cacheKey] != null; 
    } 
} 

他のファイルが変更されたとき、キャッシュが自動的に有効期限が切れるように、あなたはファイルパス(複数可)に基づいて、インスタンスのキャッシュのために、これらのパターンの両方に使用できるキャッシュの有効期限ポリシー、SQLキャッシュの依存関係があります(ありません変更のためのSQLサーバーの定期的なポーリング)、有効期限切れ、または独自のビルドが可能です。彼らは本当に便利です。

関連する問題