public virtual string GetCacheKey(_IInvocation invocation, IDictionary<string, object> invocationContext)
{
var info = invocationContext.TryGetByKey<ICacheSettings>(Global.__flatwhite_outputcache_attribute);
if (info == null)
{
throw new InvalidOperationException($"{nameof(ICacheSettings)} object not found in {nameof(invocationContext)}");
}
// The cache key must be different for different instance of same type
var key = new StringBuilder($"Flatwhite::{(invocation.Method.DeclaringType ?? invocation.TargetType).FullName}.{invocation.Method.Name}(");
var varyByParams = (info.VaryByParam ?? "").Split(new [] {',',' '}, StringSplitOptions.RemoveEmptyEntries);
var varyByCustoms = info.GetAllVaryCustomKey().Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
var parameters = invocation.Method.GetParameters();
if (parameters.Length > 0)
{
BuildWithParams(invocation, parameters, varyByParams, key);
key.Remove(key.Length - 2, 2);
}
key.Append(") :: ");
if (varyByCustoms.Length > 0)
{
foreach (var custom in varyByCustoms)
{
BuildWithCustom("", invocationContext, custom, key);
key.Append(", ");
}
}
return key.ToString().TrimEnd(' ', ':', ',');
}