私のプロジェクトの1つで同様の要件がありました。私が最終的にやったのは、各コンポーネントの DAL で継承する DataAccesLayer (DAL) キャッシュ ベースを作成することです。キャッシュを保持する別のキャッシング クラスがあります。すべてのオブジェクトに ID と名前があることに注意してください。必要に応じて基本クラスを調整できます。
DAL 基本クラス:
public abstract class DALBaseCache<T>
{
public List<T> ItemList
{
get
{
List<T> itemList = DALCache.GetItem<List<T>>(typeof(T).Name + "Cache");
if (itemList != null)
return itemList;
else
{
itemList = GetItemList();
DALCache.SetItem(typeof(T).Name + "Cache", itemList);
return itemList;
}
}
}
/// <summary>
/// Get a list of all the Items
/// </summary>
/// <returns></returns>
protected abstract List<T> GetItemList();
/// <summary>
/// Get the Item based on the ID
/// </summary>
/// <param name="name">ID of the Item to retrieve</param>
/// <returns>The Item with the given ID</returns>
public T GetItem(int id)
{
return (from item in ItemList
where (int)item.GetType().GetProperty("ID").GetValue(item, null) == id
select item).SingleOrDefault();
}
/// <summary>
/// Get the Item based on the Name
/// </summary>
/// <param name="name">Name of the Item to retrieve</param>
/// <returns>The Item with the given Name</returns>
public T GetItem(string name)
{
return (from item in ItemList
where (string)item.GetType().GetProperty("Name").GetValue(item, null) == name
select item).SingleOrDefault();
}
}
次に、基本的にクエリの辞書を保持するキャッシュ クラス
public static class DALCache
{
static Dictionary<string, object> _AppCache = new Dictionary<string, object>();
public static T GetItem<T>(string key)
{
if(_AppCache.ContainsKey(key))
{
return (T) _AppCache[key];
}
else
{
return default(T);
}
}
public static void SetItem(string key, object obj)
{
_AppCache.Add(key, obj);
}
}
最後に、キャッシュされたリストを使用した実装です。私は EF を使用して CustomerType リストを取得し、残りのアプリケーション ライフのためにキャッシュします。これは必要に応じて変更できます。
public class CustomerTypeDAL: DALBaseCache<CustomerType>
{
protected override List<CustomerType> GetItemList()
{
DBEntities entities = new DBEntities();
return Mapper.Map <List<CustomerType>>(entities.GetAllCustomerTypes().ToList());
}
}
コードのどこでも、次のように使用できます。
CustomerTypeDAL customerTypeDAL = new CustomerTypeDAL();
List<CustomerType> custTypes = customerTypeDAL.ItemList;
初めて呼び出すと、DB から取得されます。その後、キャッシュの後に移動します。