Attribute Based CachingはAdam Bell氏が最近Codeplex上で公開した新しいキャッシュライブラリだ。このライブラリは属性を使って.NETの自動的にメソッドキャッシングを実現する。アプリケーションのキャッシングは一般的には命令的な手法で行われる。つまり、多くの箇所にコードを書いて、処理に時間のかかるコールをする前にキャッシュをチェックし、その後キャッシュを満たす。Attribute Based Cachingはメソッドに[Cache.Cacheable]属性を付加するだけでこの機能を提供する。
キャッシュの無効化も宣言的な方法で制御できる。あるメソッドをキャッシュ対象にすると、ユニークなキーが選ばれる。下記のように同じキャッシュキーで他のメソッドのキャッシュを無効にできる。
[Cache.Cacheable("UserTransactionCache")]
public DataTable GetAllTransactionsForUser(int userId)
{
return new DataProvider().GetAllTransactionsForUser(userId);
}
[Cache.TriggerInvalidation("UserTransactionCache")]
public void ClearTransactionCache(int userId)
{
}
この属性にはキャッシュ機能を制御するため、多くの設定がある。CacheSettings.IgnoreParametersはあるメソッドに対するすべてのコールを同じキャッシュキーに紐づける。これはパラメータ値によってキャッシュの値が左右されてはならないメソッドのためだ。CacheSettings.UseIdはメソッドのパラメータのIdプロパティを使ってキャッシュキーを作成する。CacheSettings.UsePropertyはキャッシュキーを作るために開発者にメソッドのパラメータを定義させる。新しいバージョンの1.2.1にはIgnoreTTLがある。これはマークしたメソッドのキャッシュがなくならないようにする。またこのバージョンではICollectionパラメータを伴うメソッドコールのキャッシュができるようになっている。
キャッシュの実装は3つ提供される。ディレクトリとして実装されるInProcessMemoryCache、ディスクに保存される2分木をつかったBTreeCache、そしてMicrosoftのApplicationServer.Cachingを使うOutOfProcessMemoryCache。どの実装を使うかは構成ファイルで設定するか、コードに直に書くこともできる。これらの実装で不十分ならICacheインターフェイスを使うと独自のキャッシュタイプを実装できる。
内部的にはAttribute Based Cachingpostsharpを使ってメソッドをインターセプトしている。Postsharpは特定のタイミングでコードを実行する属性を作成するライブラリだ。メソッドがコードを実行するために割り当てられたとき、実行が終わったとき、例外が発生したときなどに属性がセットされる。最終的にAttribute Based Cachingはキャッシュバージョンがあれば、メソッドをコールして値を返す代わりに、キャッシュされた値を返す
Attribute Based CachingはNew BSD Licenseで公開されている。このライセンスではコピーライトを表示しをライセンスの免責条項を維持する限り、利用目的を問わず無制限に再配布できる。