リポジトリレベルのデータキャッシュを実装する正しい方法は何ですか? (これは、キャッシュとリポジトリとの関係についてです、キャッシュ・プロバイダーに関するものではありません!)リポジトリレベルのデータキャッシュを正しく実装する方法
策#1:注入された外部のシンプルなキャッシュ
public class MyRepository : IMyRepository
{
private readonly IDataCache _dataCache;
public MyRepository(IDataCache dataCache)
{
_dataCache = dataCache;
}
public string Get(int id)
{
var result = _dataCache.Get(id) as string;
if (result == null)
{
//Go fetch data from data source
_dataCache.Add(id, result);
}
return result;
}
}
溶液#2:同じインターフェイス を実装する追加のCachedRepositoryクラス(これは正しく解決するためにいくつかのファンキーなDIの設定が必要になりますが、それは可能です)
public class MyRepository : IMyRepository
{
private readonly IDataCache _dataCache;
public MyRepository(IDataCache dataCache)
{
_dataCache = dataCache;
}
public string Get(int id)
{
//Go fetch data from data source
return result;
}
}
public class CachedMyRepository : IMyRepository
{
private readonly IMyRepository _myRepository;
private readonly IDataCache _dataCache;
public CachedMyRepository(IMyRepository myRepository, IDataCache dataCache)
{
_dataCache = dataCache;
_myRepository = myRepository;
}
public string Get(int id)
{
var result = _dataCache.Get(id) as string;
if (result == null)
{
result = _myRepository.Get(id);
_dataCache.Add(id, result);
}
return result;
}
}
(各ソリューションは、引数のために、この単純なリポジトリやキャッシュのインターフェイスに基づいています)
public interface IMyRepository
{
string Get(int id);
}
public interface IDataCache
{
object Get(object key);
void Add(object key, object item);
}
状態を変更しないオブジェクトをキャッシュしていますか?いつあなたのキャッシュを無効にするつもりですか? IDataCacheインターフェイスから私に決して似ていないように見えます。 –
Mc Kevin。あなたはその点を欠いている。これはキャッシュ実装ではなく、リポジトリとキャッシュの関係です。ご質問をお読みください。 –
解決策2は私には良く見えますが、解決策2のMyRepositoryにIDataCacheは必要ないと思います。 –