キャッシュ機能付きKeyValueクラスを作る |
実装する機能は下記の通りです。
・キーワードに対して、任意のリソースから値を取得する
・キーワードと取得した値をキャッシュに格納する
(リソースへのアクセスを必要最低限に留める)
【サンプルを作成した環境】
・WindowsForms
・.NetFramework 4.0
※VisualStudio C# 2010 Express使用
サンプルのネームスペースの構造
WinKeywordDictionary
-Common
-KeyValueChacheBase.cs
-KeyValueChacheSample.cs
-Form1.cs
今回実装するサンプルの完成イメージです。
コンボボックスからキーワードを選択すると、リソースから取得した値をラベルに表示します。
まずはスーパークラスを作成します。
using System;
using System.Collections.Generic;
namespace WinKeywordDictionary.Common
{
/// <summary>
/// キャッシュ付KeyValue スーパークラス
/// </summary>
public abstract class KeyValueChacheBase
{
/// <summary>
/// キャッシュ
/// </summary>
/// <remarks>
/// リソースから読み取ったデータを格納する
/// </remarks>
private Dictionary<string, string> chache = null;
/// <summary>
/// コンストラクタ
/// </summary>
public KeyValueChacheBase()
{
//キャッシュ生成
this.chache = new Dictionary<string, string>();
}
/// <summary>
/// Value取得
/// </summary>
/// <param name="keyword">キーワード</param>
/// <returns>Value</returns>
/// <remarks>
/// キャッシュに存在しない場合はリソースから読み取る
/// </remarks>
public string GetValue(string keyword)
{
if (this.chache.ContainsKey(keyword) == false)
{
//キャッシュに存在しない場合はgetKeyValueメソッドを実行
var value = getValueFromResource(keyword);
if (value == null)
{
//取得できない場合は例外エラー
throw new Exception(string.Format("{0} none...", keyword));
}
//取得結果をキャッシュに格納
this.chache.Add(keyword, value);
}
return this.chache[keyword];
}
/// <summary>
/// リソース(DBやファイルなど)から値を取得
/// </summary>
/// <param name="keyword">キーワード</param>
/// <returns>取得結果(取得出来ない場合はnull)</returns>
/// <remarks>
/// 継承したクラスで具体的な取得処理を実装する
/// </remarks>
abstract protected string getValueFromResource(string keyword);
}
}
実際に利用する際はこのクラスを継承したサブクラスを作成します。
namespace WinKeywordDictionary
{
/// <summary>
/// KeyValueChacheのサンプル実装
/// </summary>
public class KeyValueChacheSample:Common.KeyValueChacheBase
{
/// <summary>
/// リソース(DBやファイルなど)から値を取得
/// </summary>
/// <param name="keyword">キーワード</param>
/// <returns>取得結果(取得出来ない場合はnull)</returns>
/// <remarks>
/// 今回はソースコードで実装しています。
/// 実際はファイルやデータベースなどから情報を取得する処理を実装します。
/// </remarks>
protected override string getValueFromResource(string keyword)
{
string value = null;
switch (keyword)
{
case "Test":
value = "テスト";
break;
case "Sample":
value = "サンプル";
break;
}
return value;
}
}
}
実際に利用する場合はデータベースやファイルから値を取得する感じだと思います。
作成したサブクラスの利用例です。
フォームにコンボボックスとラベルを配置します。
-------
Test
Sample
取得不能
-------
コンボボックスのSelectedIndexChangedイベントに次の実装を行います。
/// <summary>
/// コンボボックスの選択項目変更イベント
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
var value = this.keywordChache.GetValue((sender as ComboBox).SelectedItem.ToString());
this.label1.Text = value;
}
catch (Exception ex)
{
this.label1.Text = "該当なし:" + ex.Message;
}
}
サブクラスではリソースからの取得処理を実装させることで
・クライアント用サブクラスではWCF(Service References)経由
・サーバ用サブクラスではEntityFramework経由
と値の取得方法を変えることが出来ます。
参考になれば幸いです。
よかったらクリックしてください。
にほんブログ村