0

キャッシング用のアスペクトを作成したい。メソッド呼び出しからキャッシュ キーを作成し、戻り値とともにキャッシュに挿入する方法を知る必要があります。この部分に利用できる解決策はありますか。完全なキャッシング ソリューションは必要ありません

ありがとう

4

1 に答える 1

0

以前、このタイプの機能に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;
    }
}
于 2012-04-09T08:52:36.720 に答える