Here's some source for a baseline, generic cache that is similar to one that I use.
using System;
using System.Collections.Generic;
namespace GenericCache
{
public class SearchCache<T> : List<T>
where T : class
{
public delegate IEnumerable<T> DataSourceFunction();
#region Properties
private static SearchCache<T> _instance;
private static readonly object _syncLock = new object();
public DateTime Initialized { get; private set; }
public DateTime Refreshed { get; private set; }
public int Interval { get; private set; }
public DataSourceFunction DataSource { get; set; }
public int Hits { get; protected set; }
public int ReachBacks { get; protected set; }
public int CacheHits
{
get { return Hits - ReachBacks; }
}
#endregion
#region CTOR/DTOR
public SearchCache(DataSourceFunction dataSource)
{
Initialized = DateTime.Now;
Interval = 60;
Hits = 0;
ReachBacks = 0;
DataSource = dataSource;
CheckInterval();
}
#endregion
#region Internal Methods
private void CheckInterval()
{
Hits++;
if (Refreshed.AddMinutes(Interval) < DateTime.Now)
{
Populate();
}
}
private void Populate()
{
this.Clear();
this.AddRange(DataSource());
ReachBacks++;
Refreshed = DateTime.Now;
}
#endregion
#region External Methods
public static SearchCache<T> Instance(DataSourceFunction dataSource)
{
if (_instance == null)
{
lock (_syncLock)
{
_instance = new SearchCache<T>(dataSource);
}
}
_instance.CheckInterval();
return _instance;
}
public void Refresh()
{
Hits++;
Populate();
}
public void Zeroize()
{
Clear();
Initialized = DateTime.Now;
Hits = 1;
ReachBacks = 0;
Populate();
}
#endregion
}
}
You need a data source function that provides IEnumerable<T>, and it is populated with:
var myCache = SearchCache<T>.Instance();