キャッシング用のアスペクトを作成したい。メソッド呼び出しからキャッシュ キーを作成し、戻り値とともにキャッシュに挿入する方法を知る必要があります。この部分に利用できる解決策はありますか。完全なキャッシング ソリューションは必要ありません
ありがとう
キャッシング用のアスペクトを作成したい。メソッド呼び出しからキャッシュ キーを作成し、戻り値とともにキャッシュに挿入する方法を知る必要があります。この部分に利用できる解決策はありますか。完全なキャッシング ソリューションは必要ありません
ありがとう
以前、このタイプの機能にRealProxyを使用したことがあります。ブログ投稿でいくつかの例を示しました。RealProxy を使用したメソッド呼び出しのインターセプト。
メソッドのハッシュ コード (同じ引数を持つ 2 つの異なるメソッドが別々にキャッシュされるようにするため) と引数を使用するキャッシング プロキシの簡単な例。out-parameters は処理されず、戻り値のみが処理されることに注意してください。(これを変更する場合は、戻り値と出力パラメーターの両方を含むオブジェクトを保持するように変更する必要があり_cache
ます。) また、この実装にはフォーム av スレッド セーフがありません。
public class CachingProxy<T> : ProxyBase<T> where T : class {
private readonly IDictionary<Int32, Object> _cache = new Dictionary<Int32, Object>();
public CachingProxy(T instance)
: base(instance) {
}
protected override IMethodReturnMessage InvokeMethodCall(IMethodCallMessage msg) {
var cacheKey = GetMethodCallHashCode(msg);
Object result;
if (_cache.TryGetValue(cacheKey, out result))
return new ReturnMessage(result, msg.Args, msg.ArgCount, msg.LogicalCallContext, msg);
var returnMessage = base.InvokeMethodCall(msg);
if (returnMessage.Exception == null)
_cache[cacheKey] = returnMessage.ReturnValue;
return returnMessage;
}
protected virtual Int32 GetMethodCallHashCode(IMethodCallMessage msg) {
var hash = msg.MethodBase.GetHashCode();
foreach(var arg in msg.InArgs) {
var argHash = (arg != null) ? arg.GetHashCode() : 0;
hash = ((hash << 5) + hash) ^ argHash;
}
return hash;
}
}