大きな XML ドキュメントを読み取り、C# オブジェクトのリストを生成するヘルパー クラスがあります。
私はこれらのオブジェクトをかなり頻繁に扱っているので、これを行う最善の方法は、メモリに保存してそこからアクセスすることだと思いました。
メモリからオブジェクトを取得する単純なリポジトリを作成し、存在しない場合は追加します。
リポジトリは次のようになります。
public class XmlDocumentRepository
{
private readonly ICacheStorage _cacheStorage;
public XmlDocumentRepository(ICacheStorage cacheStorage)
{
_cacheStorage = cacheStorage;
}
private readonly object _locker = new object();
private void DeserializeXmlDocument()
{
lock (_locker)
{
// I deserialize the xml document, i generate the c# classes, and save them in cache
IEnumerable<Page> pages = new XmlDeserializerHelper().DeserializeXml();
foreach(var page in pages)
{
_cacheStorage.Add(page_Id, page);
}
}
}
public Page GetPage(Guid page_Id)
{
Page page = _cacheStorage.Get<Page>(page_Id);
if (page != null)
return page;
lock (_locker)
{
page = _cacheStorage.Get<Page>(page_Id);
if (page != null)
return page;
DeserializeXmlDocument();
page = _cacheStorage.Get<Page>(page_Id);
return page;
}
}
}
はXmlDocumentRepository
Web アプリケーション内で使用されます (より正確には asp.net mvc)。
リポジトリの実装は適切ですか? lock
ステートメントを適切に使用していますか?