Skip to content

Commit 929c3f7

Browse files
authored
Merge pull request #88 from Powerz/feature/upgrade-serilog-ai-2
Interceptor should generate valid cache key for basic type parameters
2 parents cedbeed + f578533 commit 929c3f7

File tree

3 files changed

+107
-117
lines changed

3 files changed

+107
-117
lines changed
Lines changed: 14 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
namespace EasyCaching.Core.Interceptor
22
{
3-
using System;
43
using System.Collections.Generic;
54
using System.Linq;
65
using System.Reflection;
@@ -11,132 +10,34 @@
1110
/// </summary>
1211
public class DefaultEasyCachingKeyGenerator : IEasyCachingKeyGenerator
1312
{
14-
/// <summary>
15-
/// The link char of cache key.
16-
/// </summary>
17-
private char _linkChar = ':';
13+
private const char LinkChar = ':';
1814

19-
/// <summary>
20-
/// Gets the cache key.
21-
/// </summary>
22-
/// <returns>The cache key.</returns>
23-
/// <param name="methodInfo">Method info.</param>
24-
/// <param name="args">Arguments.</param>
25-
/// <param name="prefix">Prefix.</param>
2615
public string GetCacheKey(MethodInfo methodInfo, object[] args, string prefix)
2716
{
28-
if(string.IsNullOrWhiteSpace(prefix))
29-
{
30-
var typeName = methodInfo.DeclaringType.Name;
31-
var methodName = methodInfo.Name;
32-
33-
var methodArguments = this.FormatArgumentsToPartOfCacheKey(args);
34-
35-
return this.GenerateCacheKey(typeName, methodName, methodArguments);
36-
}
37-
else
38-
{
39-
var methodArguments = this.FormatArgumentsToPartOfCacheKey(args);
40-
41-
return this.GenerateCacheKey(string.Empty, prefix, methodArguments);
42-
}
17+
var methodArguments = args?.Any() == true
18+
? args.Select(ParameterCacheKeys.GenerateCacheKey)
19+
: new[] { "0" };
20+
return GenerateCacheKey(methodInfo, prefix, methodArguments);
4321
}
4422

45-
/// <summary>
46-
/// Gets the cache key prefix.
47-
/// </summary>
48-
/// <returns>The cache key prefix.</returns>
49-
/// <param name="methodInfo">Method info.</param>
50-
/// <param name="prefix">Prefix.</param>
5123
public string GetCacheKeyPrefix(MethodInfo methodInfo, string prefix)
5224
{
53-
if (string.IsNullOrWhiteSpace(prefix))
54-
{
55-
var typeName = methodInfo.DeclaringType.Name;
56-
var methodName = methodInfo.Name;
25+
if (!string.IsNullOrWhiteSpace(prefix)) return $"{prefix}{LinkChar}";
5726

58-
return this.GenerateCacheKeyPrefix(typeName, methodName);
59-
}
60-
else
61-
{
62-
return this.GenerateCacheKeyPrefix(string.Empty, prefix);
63-
}
64-
}
27+
var typeName = methodInfo.DeclaringType?.Name;
28+
var methodName = methodInfo.Name;
6529

66-
/// <summary>
67-
/// Generates the cache key prefix.
68-
/// </summary>
69-
/// <returns>The cache key prefix.</returns>
70-
/// <param name="first">First.</param>
71-
/// <param name="second">Second.</param>
72-
private string GenerateCacheKeyPrefix(string first, string second)
73-
{
74-
return string.Concat(first,_linkChar,second,_linkChar).TrimStart(_linkChar);
30+
return $"{typeName}{LinkChar}{methodName}{LinkChar}";
7531
}
7632

77-
/// <summary>
78-
/// Formats the arguments to part of cache key.
79-
/// </summary>
80-
/// <returns>The arguments to part of cache key.</returns>
81-
/// <param name="methodArguments">Method arguments.</param>
82-
private IList<string> FormatArgumentsToPartOfCacheKey(object[] methodArguments)
33+
private string GenerateCacheKey(MethodInfo methodInfo, string prefix, IEnumerable<string> parameters)
8334
{
84-
if(methodArguments!=null && methodArguments.Length > 0)
85-
{
86-
return methodArguments.Select(this.GetArgumentValue).ToList();
87-
}
88-
else
89-
{
90-
return new List<string> { "0" };
91-
}
92-
}
35+
var cacheKeyPrefix = GetCacheKeyPrefix(methodInfo, prefix);
9336

94-
/// <summary>
95-
/// Generates the cache key.
96-
/// </summary>
97-
/// <returns>The cache key.</returns>
98-
/// <param name="typeName">Type name.</param>
99-
/// <param name="methodName">Method name.</param>
100-
/// <param name="parameters">Parameters.</param>
101-
private string GenerateCacheKey(string typeName, string methodName, IList<string> parameters)
102-
{
10337
var builder = new StringBuilder();
104-
105-
builder.Append(this.GenerateCacheKeyPrefix(typeName,methodName));
106-
107-
foreach (var param in parameters)
108-
{
109-
builder.Append(param);
110-
builder.Append(_linkChar);
111-
}
112-
113-
var str = builder.ToString().TrimEnd(_linkChar);
114-
115-
return str;
116-
//using (SHA1 sha1 = SHA1.Create())
117-
//{
118-
// byte[] data = sha1.ComputeHash(Encoding.UTF8.GetBytes(str));
119-
// return Convert.ToBase64String(data, Base64FormattingOptions.None);
120-
//}
121-
}
122-
123-
/// <summary>
124-
/// Gets the argument value.
125-
/// </summary>
126-
/// <returns>The argument value.</returns>
127-
/// <param name="arg">Argument.</param>
128-
private string GetArgumentValue(object arg)
129-
{
130-
if (arg is int || arg is long || arg is string)
131-
return arg.ToString();
132-
133-
if (arg is DateTime)
134-
return ((DateTime)arg).ToString("yyyyMMddHHmmss");
135-
136-
if (arg is ICachable)
137-
return ((ICachable)arg).CacheKey;
138-
139-
return null;
38+
builder.Append(cacheKeyPrefix);
39+
builder.Append(string.Join(LinkChar.ToString(), parameters));
40+
return builder.ToString();
14041
}
14142
}
14243
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using System;
2+
using System.Collections;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
6+
namespace EasyCaching.Core.Interceptor
7+
{
8+
public static class ParameterCacheKeys
9+
{
10+
public static string GenerateCacheKey(object parameter)
11+
{
12+
if (parameter == null) return string.Empty;
13+
if (parameter is ICachable cachable) return cachable.CacheKey;
14+
if (parameter is string key) return key;
15+
if (parameter is DateTime dateTime) return dateTime.ToString("O");
16+
if (parameter is DateTimeOffset dateTimeOffset) return dateTimeOffset.ToString("O");
17+
if (parameter is IEnumerable enumerable) return GenerateCacheKey(enumerable.Cast<object>());
18+
return parameter.ToString();
19+
}
20+
21+
private static string GenerateCacheKey(IEnumerable<object> parameter)
22+
{
23+
if (parameter == null) return string.Empty;
24+
return "[" + string.Join(",", parameter) + "]";
25+
}
26+
}
27+
}

test/EasyCaching.UnitTests/Core/DefaultEasyCachingKeyGeneratorTest.cs

Lines changed: 66 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,18 @@ public void Generate_CacheKey_With_String_Param_Method_Should_Succeed()
7171
Assert.Equal($"Demo:Method3:str", key);
7272
}
7373

74+
[Fact]
75+
public void Generate_CacheKey_With_Guid_Param_Method_Should_Succeed()
76+
{
77+
var methodName = "Method3";
78+
MethodInfo methodInfo = typeof(Demo).GetMethod(methodName);
79+
80+
var newGuid = Guid.NewGuid();
81+
var key = _keyGenerator.GetCacheKey(methodInfo, new object[] { newGuid }, string.Empty);
82+
83+
Assert.Equal($"Demo:Method3:{newGuid.ToString()}", key);
84+
}
85+
7486
[Fact]
7587
public void Generate_CacheKey_With_String_Param_And_Prefix_Method_Should_Succeed()
7688
{
@@ -88,9 +100,10 @@ public void Generate_CacheKey_With_DateTime_Param_Method_Should_Succeed()
88100
var methodName = "Method4";
89101
MethodInfo methodInfo = typeof(Demo).GetMethod(methodName);
90102

91-
var key = _keyGenerator.GetCacheKey(methodInfo, null, string.Empty);
103+
var dateTime = DateTime.Now;
104+
var key = _keyGenerator.GetCacheKey(methodInfo, new object[] { dateTime }, string.Empty);
92105

93-
Assert.Equal($"Demo:Method4:0", key);
106+
Assert.Equal($"Demo:Method4:{dateTime:O}", key);
94107
}
95108

96109
[Fact]
@@ -99,9 +112,58 @@ public void Generate_CacheKey_With_DateTime_Param_And_Prefix_Method_Should_Succe
99112
var methodName = "Method4";
100113
MethodInfo methodInfo = typeof(Demo).GetMethod(methodName);
101114

102-
var key = _keyGenerator.GetCacheKey(methodInfo, null, "GenKey");
115+
var dateTime = DateTime.Now;
116+
var key = _keyGenerator.GetCacheKey(methodInfo, new object[] { dateTime }, "GenKey");
103117

104-
Assert.Equal($"GenKey:0", key);
118+
Assert.Equal($"GenKey:{dateTime:O}", key);
119+
}
120+
121+
[Fact]
122+
public void Generate_CacheKey_With_DateTimeOffset_Param_Method_Should_Succeed()
123+
{
124+
var methodName = "Method4";
125+
MethodInfo methodInfo = typeof(Demo).GetMethod(methodName);
126+
127+
var dateTime = DateTimeOffset.Now;
128+
var key = _keyGenerator.GetCacheKey(methodInfo, new object[] { dateTime }, string.Empty);
129+
130+
Assert.Equal($"Demo:Method4:{dateTime:O}", key);
131+
}
132+
133+
[Fact]
134+
public void Generate_CacheKey_With_DateTimeOffset_Param_And_Prefix_Method_Should_Succeed()
135+
{
136+
var methodName = "Method4";
137+
MethodInfo methodInfo = typeof(Demo).GetMethod(methodName);
138+
139+
var dateTime = DateTimeOffset.Now;
140+
var key = _keyGenerator.GetCacheKey(methodInfo, new object[] { dateTime }, "GenKey");
141+
142+
Assert.Equal($"GenKey:{dateTime:O}", key);
143+
}
144+
145+
[Fact]
146+
public void Generate_CacheKey_With_Array_Param_Method_Should_Succeed()
147+
{
148+
var methodName = "Method4";
149+
MethodInfo methodInfo = typeof(Demo).GetMethod(methodName);
150+
151+
var array = new[] { 1, 2, 3 };
152+
var key = _keyGenerator.GetCacheKey(methodInfo, new object[] { array }, string.Empty);
153+
154+
Assert.Equal($"Demo:Method4:[1,2,3]", key);
155+
}
156+
157+
[Fact]
158+
public void Generate_CacheKey_With_Array_Param_And_Prefix_Method_Should_Succeed()
159+
{
160+
var methodName = "Method4";
161+
MethodInfo methodInfo = typeof(Demo).GetMethod(methodName);
162+
163+
var array = new[] { 1, 2, 3 };
164+
var key = _keyGenerator.GetCacheKey(methodInfo, new object[] { array }, "GenKey");
165+
166+
Assert.Equal($"GenKey:[1,2,3]", key);
105167
}
106168

107169
[Fact]

0 commit comments

Comments
 (0)